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

Unified Diff: remoting/host/capturer_linux.cc

Issue 7491070: Switch over to using SkRegions to calculate dirty areas. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: clean up comments Created 9 years, 4 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
Index: remoting/host/capturer_linux.cc
diff --git a/remoting/host/capturer_linux.cc b/remoting/host/capturer_linux.cc
index 0c797153fb72e30fed5d79b261e2ca2c695aea1d..a7c8729d6dcb3fd7a6fa8ff076cd6f2605827a3d 100644
--- a/remoting/host/capturer_linux.cc
+++ b/remoting/host/capturer_linux.cc
@@ -13,7 +13,6 @@
#include "base/basictypes.h"
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
-#include "remoting/base/types.h"
#include "remoting/host/capturer_helper.h"
#include "remoting/host/differ.h"
#include "remoting/host/x_server_pixel_buffer.h"
@@ -75,11 +74,12 @@ class CapturerLinux : public Capturer {
// 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 ClearInvalidRegion() OVERRIDE;
+ virtual void InvalidateRegion(const SkRegion& inval_region) OVERRIDE;
virtual void InvalidateScreen(const gfx::Size& size) OVERRIDE;
virtual void InvalidateFullScreen() OVERRIDE;
- virtual void CaptureInvalidRects(CaptureCompletedCallback* callback) OVERRIDE;
+ virtual void CaptureInvalidRegion(CaptureCompletedCallback* callback)
+ OVERRIDE;
virtual const gfx::Size& size_most_recent() const OVERRIDE;
private:
@@ -114,12 +114,12 @@ class CapturerLinux : public Capturer {
// Capture a rectangle from |x_server_pixel_buffer_|, and copy the data into
// |capture_data|.
- void CaptureRect(const gfx::Rect& rect, CaptureData* capture_data);
+ void CaptureRect(const SkIRect& rect, CaptureData* capture_data);
// We expose two forms of blitting to handle variations in the pixel format.
// In FastBlit, the operation is effectively a memcpy.
- void FastBlit(uint8* image, const gfx::Rect& rect, CaptureData* capture_data);
- void SlowBlit(uint8* image, const gfx::Rect& rect, CaptureData* capture_data);
+ void FastBlit(uint8* image, const SkIRect& rect, CaptureData* capture_data);
+ void SlowBlit(uint8* image, const SkIRect& rect, CaptureData* capture_data);
// X11 graphics context.
Display* display_;
@@ -147,9 +147,9 @@ class CapturerLinux : public Capturer {
// Format of pixels returned in buffer.
media::VideoFrame::Format pixel_format_;
- // Invalid rects in the last capture. This is used to synchronize current with
- // the previous buffer used.
- InvalidRects last_invalid_rects_;
+ // Invalid region from the last capture. This is used to synchronize current
+ // with the previous buffer used.
Wez 2011/08/08 20:49:34 nit: This comment doesn't parse.
dmac 2011/08/10 20:30:36 Done.
+ SkRegion last_invalid_region_;
// Last capture buffer used.
uint8* last_buffer_;
@@ -240,8 +240,8 @@ void CapturerLinux::ScreenConfigurationChanged() {
for (int i = 0; i < kNumBuffers; ++i) {
buffers_[i].set_needs_update();
}
- InvalidRects rects;
- helper_.SwapInvalidRects(rects);
+ SkRegion region;
+ helper_.SwapInvalidRegion(region);
Wez 2011/08/08 20:49:34 Since |region| isn't used after this call, isn't i
dmac 2011/08/10 20:30:36 Done.
x_server_pixel_buffer_.Init(display_);
}
@@ -249,12 +249,12 @@ media::VideoFrame::Format CapturerLinux::pixel_format() const {
return pixel_format_;
}
-void CapturerLinux::ClearInvalidRects() {
- helper_.ClearInvalidRects();
+void CapturerLinux::ClearInvalidRegion() {
+ helper_.ClearInvalidRegion();
}
-void CapturerLinux::InvalidateRects(const InvalidRects& inval_rects) {
- helper_.InvalidateRects(inval_rects);
+void CapturerLinux::InvalidateRegion(const SkRegion& inval_region) {
+ helper_.InvalidateRegion(inval_region);
}
void CapturerLinux::InvalidateScreen(const gfx::Size& size) {
@@ -266,7 +266,7 @@ void CapturerLinux::InvalidateFullScreen() {
last_buffer_ = NULL;
}
-void CapturerLinux::CaptureInvalidRects(
+void CapturerLinux::CaptureInvalidRegion(
CaptureCompletedCallback* callback) {
scoped_ptr<CaptureCompletedCallback> callback_deleter(callback);
@@ -297,7 +297,7 @@ void CapturerLinux::ProcessPendingXEvents() {
// on XPending because we want to guarantee this terminates.
int events_to_process = XPending(display_);
XEvent e;
- InvalidRects invalid_rects;
+ SkRegion invalid_region;
for (int i = 0; i < events_to_process; i++) {
XNextEvent(display_, &e);
@@ -308,21 +308,23 @@ void CapturerLinux::ProcessPendingXEvents() {
if (event->area.width <= 0 || event->area.height <= 0)
continue;
- gfx::Rect damage_rect(event->area.x, event->area.y, event->area.width,
- event->area.height);
- invalid_rects.insert(damage_rect);
- VLOG(3) << "Damage received for rect at ("
- << damage_rect.x() << "," << damage_rect.y() << ") size ("
- << damage_rect.width() << "," << damage_rect.height() << ")";
+ SkIRect damage_rect = SkIRect::MakeXYWH(event->area.x,
+ event->area.y,
+ event->area.width,
+ event->area.height);
+ invalid_region.op(damage_rect, SkRegion::kUnion_Op);
+ DVLOG(3) << "Damage received for rect at ("
+ << damage_rect.fLeft << "," << damage_rect.fTop << ") size ("
+ << damage_rect.width() << "," << damage_rect.height() << ")";
} else if (e.type == ConfigureNotify) {
ScreenConfigurationChanged();
- invalid_rects.clear();
+ invalid_region.setEmpty();
} else {
LOG(WARNING) << "Got unknown event type: " << e.type;
}
}
- helper_.InvalidateRects(invalid_rects);
+ helper_.InvalidateRegion(invalid_region);
}
CaptureData* CapturerLinux::CaptureFrame() {
@@ -341,40 +343,39 @@ CaptureData* CapturerLinux::CaptureFrame() {
if (use_damage_ && last_buffer_)
SynchronizeFrame();
- InvalidRects invalid_rects;
+ SkRegion invalid_region;
x_server_pixel_buffer_.Synchronize();
if (use_damage_ && last_buffer_) {
- helper_.SwapInvalidRects(invalid_rects);
- for (InvalidRects::const_iterator it = invalid_rects.begin();
- it != invalid_rects.end();
- ++it) {
- CaptureRect(*it, capture_data);
+ helper_.SwapInvalidRegion(invalid_region);
+ for (SkRegion::Iterator it(invalid_region); !it.done(); it.next()) {
+ CaptureRect(it.rect(), capture_data);
}
// TODO(ajwong): We should only repair the rects that were copied!
XDamageSubtract(display_, damage_handle_, None, None);
} else {
// Doing full-screen polling, or this is the first capture after a
// screen-resolution change. In either case, need a full-screen capture.
- gfx::Rect screen_rect(buffer.size());
+ SkIRect screen_rect = SkIRect::MakeWH(buffer.size().width(),
+ buffer.size().height());
CaptureRect(screen_rect, capture_data);
if (last_buffer_) {
// Full-screen polling, so calculate the invalid rects here, based on the
// changed pixels between current and previous buffers.
DCHECK(differ_ != NULL);
- differ_->CalcDirtyRects(last_buffer_, buffer.ptr(), &invalid_rects);
+ differ_->CalcDirtyRegion(last_buffer_, buffer.ptr(), &invalid_region);
} else {
// No previous buffer, so always invalidate the whole screen, whether
// or not DAMAGE is being used. DAMAGE doesn't necessarily send a
// full-screen notification after a screen-resolution change, so
// this is done here.
- invalid_rects.insert(screen_rect);
+ invalid_region.op(screen_rect, SkRegion::kUnion_Op);
}
}
- capture_data->mutable_dirty_rects() = invalid_rects;
- last_invalid_rects_ = invalid_rects;
+ capture_data->mutable_dirty_region() = invalid_region;
+ last_invalid_region_ = invalid_region;
last_buffer_ = buffer.ptr();
return capture_data;
}
@@ -388,13 +389,12 @@ void CapturerLinux::SynchronizeFrame() {
// |rects| from |last_invalid_rects_|.
Wez 2011/08/08 20:49:34 Now that we're using regions, perhaps implement th
dmac 2011/08/10 20:30:36 Added bug
DCHECK(last_buffer_);
VideoFrameBuffer& buffer = buffers_[current_buffer_];
- for (InvalidRects::const_iterator it = last_invalid_rects_.begin();
- it != last_invalid_rects_.end();
- ++it) {
- int offset = it->y() * buffer.bytes_per_row() + it->x() * kBytesPerPixel;
- for (int i = 0; i < it->height(); ++i) {
+ for (SkRegion::Iterator it(last_invalid_region_); !it.done(); it.next()) {
+ const SkIRect& r = it.rect();
+ int offset = r.fTop * buffer.bytes_per_row() + r.fLeft * kBytesPerPixel;
+ for (int i = 0; i < r.height(); ++i) {
memcpy(buffer.ptr() + offset, last_buffer_ + offset,
- it->width() * kBytesPerPixel);
+ r.width() * kBytesPerPixel);
offset += buffer.size().width() * kBytesPerPixel;
}
}
@@ -412,26 +412,26 @@ void CapturerLinux::DeinitXlib() {
}
}
-void CapturerLinux::CaptureRect(const gfx::Rect& rect,
+void CapturerLinux::CaptureRect(const SkIRect& rect,
CaptureData* capture_data) {
uint8* image = x_server_pixel_buffer_.CaptureRect(rect);
int depth = x_server_pixel_buffer_.GetDepth();
int bpp = x_server_pixel_buffer_.GetBitsPerPixel();
bool is_rgb = x_server_pixel_buffer_.IsRgb();
if ((depth == 24 || depth == 32) && bpp == 32 && is_rgb) {
- VLOG(3) << "Fast blitting";
+ DVLOG(3) << "Fast blitting";
FastBlit(image, rect, capture_data);
} else {
- VLOG(3) << "Slow blitting";
+ DVLOG(3) << "Slow blitting";
SlowBlit(image, rect, capture_data);
}
}
-void CapturerLinux::FastBlit(uint8* image, const gfx::Rect& rect,
+void CapturerLinux::FastBlit(uint8* image, const SkIRect& rect,
CaptureData* capture_data) {
uint8* src_pos = image;
int src_stride = x_server_pixel_buffer_.GetStride();
- int dst_x = rect.x(), dst_y = rect.y();
+ int dst_x = rect.fLeft, dst_y = rect.fTop;
DataPlanes planes = capture_data->data_planes();
uint8* dst_buffer = planes.data[0];
@@ -449,13 +449,13 @@ void CapturerLinux::FastBlit(uint8* image, const gfx::Rect& rect,
}
}
-void CapturerLinux::SlowBlit(uint8* image, const gfx::Rect& rect,
+void CapturerLinux::SlowBlit(uint8* image, const SkIRect& rect,
CaptureData* capture_data) {
DataPlanes planes = capture_data->data_planes();
uint8* dst_buffer = planes.data[0];
const int dst_stride = planes.strides[0];
int src_stride = x_server_pixel_buffer_.GetStride();
- int dst_x = rect.x(), dst_y = rect.y();
+ int dst_x = rect.fLeft, dst_y = rect.fTop;
int width = rect.width(), height = rect.height();
unsigned int red_mask = x_server_pixel_buffer_.GetRedMask();

Powered by Google App Engine
This is Rietveld 408576698