diff options
author | dmaclach@chromium.org <dmaclach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-11 05:08:49 +0000 |
---|---|---|
committer | dmaclach@chromium.org <dmaclach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-11 05:08:49 +0000 |
commit | 274e372af7a6d457e4773fdce215e3e6d70efcea (patch) | |
tree | 407836ad1a4f7a34fa14c8ff045e833d90b9b1d5 /remoting/host/capturer_mac.cc | |
parent | 418b75e0f077a184e6f1ae81f7e41e98454706dd (diff) | |
download | chromium_src-274e372af7a6d457e4773fdce215e3e6d70efcea.zip chromium_src-274e372af7a6d457e4773fdce215e3e6d70efcea.tar.gz chromium_src-274e372af7a6d457e4773fdce215e3e6d70efcea.tar.bz2 |
Switch over to using SkRegions to calculate dirty areas.
BUG=91619
TEST=Set up a remoting sesssion and make sure it works.
Review URL: http://codereview.chromium.org/7491070
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@96327 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'remoting/host/capturer_mac.cc')
-rw-r--r-- | remoting/host/capturer_mac.cc | 96 |
1 files changed, 50 insertions, 46 deletions
diff --git a/remoting/host/capturer_mac.cc b/remoting/host/capturer_mac.cc index bb9f8591..5bdd176 100644 --- a/remoting/host/capturer_mac.cc +++ b/remoting/host/capturer_mac.cc @@ -15,6 +15,7 @@ #include "base/memory/scoped_ptr.h" #include "remoting/base/util.h" #include "remoting/host/capturer_helper.h" +#include "skia/ext/skia_utils_mac.h" namespace remoting { @@ -134,19 +135,20 @@ class CapturerMac : 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& invalid_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: - void GlBlitFast(const VideoFrameBuffer& buffer, const InvalidRects& rects); + void GlBlitFast(const VideoFrameBuffer& buffer, const SkRegion& region); void GlBlitSlow(const VideoFrameBuffer& buffer); - void CgBlit(const VideoFrameBuffer& buffer, const InvalidRects& rects); - void CaptureRects(const InvalidRects& rects, - CaptureCompletedCallback* callback); + void CgBlit(const VideoFrameBuffer& buffer, const SkRegion& region); + void CaptureRegion(const SkRegion& region, + CaptureCompletedCallback* callback); void ScreenRefresh(CGRectCount count, const CGRect *rect_array); void ScreenUpdateMove(CGScreenUpdateMoveDelta delta, @@ -176,12 +178,12 @@ class CapturerMac : public Capturer { // The current buffer with valid data for reading. int current_buffer_; - // The last buffer into which we captured, or NULL for the first capture for - // a particular screen resolution. + // The previous buffer into which we captured, or NULL for the first capture + // for a particular screen resolution. uint8* last_buffer_; - // Contains a list of invalid rectangles in the last capture. - InvalidRects last_invalid_rects_; + // Contains an invalid region from the previous capture. + SkRegion last_invalid_region_; // Format of pixels returned in buffer. media::VideoFrame::Format pixel_format_; @@ -240,8 +242,7 @@ void CapturerMac::ReleaseBuffers() { void CapturerMac::ScreenConfigurationChanged() { ReleaseBuffers(); - InvalidRects rects; - helper_.SwapInvalidRects(rects); + helper_.ClearInvalidRegion(); last_buffer_ = NULL; CGDirectDisplayID mainDevice = CGMainDisplayID(); @@ -280,12 +281,12 @@ media::VideoFrame::Format CapturerMac::pixel_format() const { return pixel_format_; } -void CapturerMac::ClearInvalidRects() { - helper_.ClearInvalidRects(); +void CapturerMac::ClearInvalidRegion() { + helper_.ClearInvalidRegion(); } -void CapturerMac::InvalidateRects(const InvalidRects& inval_rects) { - helper_.InvalidateRects(inval_rects); +void CapturerMac::InvalidateRegion(const SkRegion& invalid_region) { + helper_.InvalidateRegion(invalid_region); } void CapturerMac::InvalidateScreen(const gfx::Size& size) { @@ -296,25 +297,25 @@ void CapturerMac::InvalidateFullScreen() { helper_.InvalidateFullScreen(); } -void CapturerMac::CaptureInvalidRects(CaptureCompletedCallback* callback) { +void CapturerMac::CaptureInvalidRegion(CaptureCompletedCallback* callback) { scoped_refptr<CaptureData> data; if (capturing_) { - InvalidRects rects; - helper_.SwapInvalidRects(rects); + SkRegion region; + helper_.SwapInvalidRegion(®ion); VideoFrameBuffer& current_buffer = buffers_[current_buffer_]; current_buffer.Update(); bool flip = true; // GL capturers need flipping. if (cgl_context_) { if (pixel_buffer_object_.get() != 0) { - GlBlitFast(current_buffer, rects); + GlBlitFast(current_buffer, region); } else { // See comment in scoped_pixel_buffer_object::Init about why the slow // path is always used on 10.5. GlBlitSlow(current_buffer); } } else { - CgBlit(current_buffer, rects); + CgBlit(current_buffer, region); flip = false; } @@ -329,7 +330,7 @@ void CapturerMac::CaptureInvalidRects(CaptureCompletedCallback* callback) { data = new CaptureData(planes, gfx::Size(current_buffer.size()), pixel_format()); - data->mutable_dirty_rects() = rects; + data->mutable_dirty_region() = region; current_buffer_ = (current_buffer_ + 1) % kNumBuffers; helper_.set_size_most_recent(data->size()); @@ -340,31 +341,28 @@ void CapturerMac::CaptureInvalidRects(CaptureCompletedCallback* callback) { } void CapturerMac::GlBlitFast(const VideoFrameBuffer& buffer, - const InvalidRects& rects) { + const SkRegion& region) { if (last_buffer_) { // We are doing double buffer for the capture data so we just need to copy - // invalid rects in the last capture in the current buffer. - // TODO(hclam): |last_invalid_rects_| and |rects| can overlap and this - // causes extra copies on the overlapped region. Subtract |rects| from - // |last_invalid_rects_| to do a minimal amount of copy when we have proper - // region algorithms implemented. + // the invalid region from the previous capture in the current buffer. + // TODO(hclam): We can reduce the amount of copying here by subtracting + // |capturer_helper_|s region from |last_invalid_region_|. + // http://crbug.com/92354 // Since the image obtained from OpenGL is upside-down, need to do some // magic here to copy the correct rectangle. const int y_offset = (buffer.size().height() - 1) * buffer.bytes_per_row(); - for (InvalidRects::iterator i = last_invalid_rects_.begin(); - i != last_invalid_rects_.end(); - ++i) { + for(SkRegion::Iterator i(last_invalid_region_); !i.done(); i.next()) { CopyRect(last_buffer_ + y_offset, -buffer.bytes_per_row(), buffer.ptr() + y_offset, -buffer.bytes_per_row(), 4, // Bytes for pixel for RGBA. - *i); + i.rect()); } } last_buffer_ = buffer.ptr(); - last_invalid_rects_ = rects; + last_invalid_region_ = region; CGLContextObj CGL_MACRO_CONTEXT = cgl_context_; glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pixel_buffer_object_.get()); @@ -380,13 +378,13 @@ void CapturerMac::GlBlitFast(const VideoFrameBuffer& buffer, // Copy only from the dirty rects. Since the image obtained from OpenGL is // upside-down we need to do some magic here to copy the correct rectangle. const int y_offset = (buffer.size().height() - 1) * buffer.bytes_per_row(); - for (InvalidRects::iterator i = rects.begin(); i != rects.end(); ++i) { + for(SkRegion::Iterator i(region); !i.done(); i.next()) { CopyRect(ptr + y_offset, -buffer.bytes_per_row(), buffer.ptr() + y_offset, -buffer.bytes_per_row(), 4, // Bytes for pixel for RGBA. - *i); + i.rect()); } } if (!glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB)) { @@ -415,7 +413,7 @@ void CapturerMac::GlBlitSlow(const VideoFrameBuffer& buffer) { } void CapturerMac::CgBlit(const VideoFrameBuffer& buffer, - const InvalidRects& rects) { + const SkRegion& region) { if (last_buffer_) memcpy(buffer.ptr(), last_buffer_, buffer.bytes_per_row() * buffer.size().height()); @@ -425,13 +423,16 @@ void CapturerMac::CgBlit(const VideoFrameBuffer& buffer, reinterpret_cast<uint8*>(CGDisplayBaseAddress(main_display)); int src_bytes_per_row = CGDisplayBytesPerRow(main_display); int src_bytes_per_pixel = CGDisplayBitsPerPixel(main_display) / 8; - for (InvalidRects::iterator i = rects.begin(); i != rects.end(); ++i) { + // TODO(hclam): We can reduce the amount of copying here by subtracting + // |capturer_helper_|s region from |last_invalid_region_|. + // http://crbug.com/92354 + for(SkRegion::Iterator i(region); !i.done(); i.next()) { CopyRect(display_base_address, src_bytes_per_row, buffer.ptr(), buffer.bytes_per_row(), src_bytes_per_pixel, - *i); + i.rect()); } } @@ -440,24 +441,27 @@ const gfx::Size& CapturerMac::size_most_recent() const { } void CapturerMac::ScreenRefresh(CGRectCount count, const CGRect *rect_array) { - InvalidRects rects; + SkIRect skirect_array[count]; for (CGRectCount i = 0; i < count; ++i) { - rects.insert(gfx::Rect(rect_array[i])); + skirect_array[i] = gfx::CGRectToSkIRect(rect_array[i]); } - InvalidateRects(rects); + SkRegion region; + region.setRects(skirect_array, count); + InvalidateRegion(region); } void CapturerMac::ScreenUpdateMove(CGScreenUpdateMoveDelta delta, size_t count, const CGRect *rect_array) { - InvalidRects rects; + SkIRect skirect_new_array[count]; for (CGRectCount i = 0; i < count; ++i) { CGRect rect = rect_array[i]; - rects.insert(gfx::Rect(rect)); rect = CGRectOffset(rect, delta.dX, delta.dY); - rects.insert(gfx::Rect(rect)); + skirect_new_array[i] = gfx::CGRectToSkIRect(rect); } - InvalidateRects(rects); + SkRegion region; + region.setRects(skirect_new_array, count); + InvalidateRegion(region); } void CapturerMac::ScreenRefreshCallback(CGRectCount count, |