Chromium Code Reviews| 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(); |