Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(708)

Unified Diff: remoting/host/capturer_win.cc

Issue 6780014: Clean up remoting project (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: got rid of ref counting on user authenticator Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « remoting/host/capturer_mac_unittest.cc ('k') | remoting/host/capturer_win_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
« no previous file with comments | « remoting/host/capturer_mac_unittest.cc ('k') | remoting/host/capturer_win_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698