diff options
author | danakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-20 21:46:11 +0000 |
---|---|---|
committer | danakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-20 21:46:11 +0000 |
commit | d4d017e13286b6d328dd5a62d324149b863189ad (patch) | |
tree | c24d576eb00a033aef3f1d7d136bfe7d248b4778 /cc/output | |
parent | 83b3c9e05dffd57392fc3877c6b3c3f4546c210d (diff) | |
download | chromium_src-d4d017e13286b6d328dd5a62d324149b863189ad.zip chromium_src-d4d017e13286b6d328dd5a62d324149b863189ad.tar.gz chromium_src-d4d017e13286b6d328dd5a62d324149b863189ad.tar.bz2 |
cc: Allow output readback/copy requests to specify a sub-rect to copy.
The CopyOutputRequest API is on cc::Layer, so the rect it is given
should be in layer space.
Also add tests for CompositeAndReadback which no longer had any pixel
test coverage in cc/ to ensure that its inputs are correctly applied
as device viewport space.
Clean up the layer tree pixel test framework by passing the test type
(GL/Software cross Bitmap/Texture) as a parameter to RunPixelTest()
instead of having tests set a pair of bools. Forces all tests to
specify the test type.
Tests:
LayerTreeHostReadbackPixelTest.ReadbackSubrect_Software
LayerTreeHostReadbackPixelTest.ReadbackSubrect_GL_Bitmap
LayerTreeHostReadbackPixelTest.ReadbackSubrect_GL
LayerTreeHostReadbackPixelTest.ReadbackNonRootLayerSubrect_Software
LayerTreeHostReadbackPixelTest.ReadbackNonRootLayerSubrect_GL_Bitmap
LayerTreeHostReadbackPixelTest.ReadbackNonRootLayerSubrect_GL
LayerTreeHostReadbackDeviceScalePixelTest.ReadbackSubrect_Software
LayerTreeHostReadbackDeviceScalePixelTest.ReadbackSubrect_GL
LayerTreeHostReadbackDeviceScalePixelTest.ReadbackNonRootLayerSubrect_Software
LayerTreeHostReadbackDeviceScalePixelTest.ReadbackNonRootLayerSubrect_GL
LayerTreeHostReadbackViaCompositeAndReadbackPixelTest.CompositeAndReadback_Software_1
LayerTreeHostReadbackViaCompositeAndReadbackPixelTest.CompositeAndReadback_Software_2
LayerTreeHostReadbackViaCompositeAndReadbackPixelTest.CompositeAndReadback_GL_1
LayerTreeHostReadbackViaCompositeAndReadbackPixelTest.CompositeAndReadback_GL_2
R=piman
BUG=251754
Merged https://codereview.chromium.org/17449014/ and
https://codereview.chromium.org/17261009/ into this CL.
Review URL: https://chromiumcodereview.appspot.com/17335011
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@207589 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc/output')
-rw-r--r-- | cc/output/copy_output_request.cc | 1 | ||||
-rw-r--r-- | cc/output/copy_output_request.h | 22 | ||||
-rw-r--r-- | cc/output/gl_renderer.cc | 9 | ||||
-rw-r--r-- | cc/output/software_renderer.cc | 14 |
4 files changed, 38 insertions, 8 deletions
diff --git a/cc/output/copy_output_request.cc b/cc/output/copy_output_request.cc index 90ece04..341d887 100644 --- a/cc/output/copy_output_request.cc +++ b/cc/output/copy_output_request.cc @@ -19,6 +19,7 @@ CopyOutputRequest::CopyOutputRequest( bool force_bitmap_result, const CopyOutputRequestCallback& result_callback) : force_bitmap_result_(force_bitmap_result), + has_area_(false), result_callback_(result_callback) { } diff --git a/cc/output/copy_output_request.h b/cc/output/copy_output_request.h index 54fff1a..b7eb0b4 100644 --- a/cc/output/copy_output_request.h +++ b/cc/output/copy_output_request.h @@ -8,7 +8,7 @@ #include "base/callback.h" #include "base/memory/scoped_ptr.h" #include "cc/base/cc_export.h" -#include "ui/gfx/size.h" +#include "ui/gfx/rect.h" class SkBitmap; @@ -35,15 +35,29 @@ class CC_EXPORT CopyOutputRequest { static scoped_ptr<CopyOutputRequest> CreateRelayRequest( const CopyOutputRequest& original_request, const CopyOutputRequestCallback& result_callback) { - return make_scoped_ptr(new CopyOutputRequest( - original_request.force_bitmap_result(), result_callback)); + scoped_ptr<CopyOutputRequest> relay = CreateRequest(result_callback); + relay->force_bitmap_result_ = original_request.force_bitmap_result_; + relay->has_area_ = original_request.has_area_; + relay->area_ = original_request.area_; + return relay.Pass(); } ~CopyOutputRequest(); bool IsEmpty() const { return result_callback_.is_null(); } + bool force_bitmap_result() const { return force_bitmap_result_; } + // By default copy requests copy the entire layer's subtree output. If an + // area is given, then the intersection of this rect (in layer space) with + // the layer's subtree output will be returned. + void set_area(gfx::Rect area) { + has_area_ = true; + area_ = area; + } + bool has_area() const { return has_area_; } + gfx::Rect area() const { return area_; } + void SendResult(scoped_ptr<CopyOutputResult> result); void SendBitmapResult(scoped_ptr<SkBitmap> bitmap); void SendTextureResult(gfx::Size size, @@ -60,6 +74,8 @@ class CC_EXPORT CopyOutputRequest { const CopyOutputRequestCallback& result_callback); bool force_bitmap_result_; + bool has_area_; + gfx::Rect area_; CopyOutputRequestCallback result_callback_; }; diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc index 2a27ff7..3527ed1 100644 --- a/cc/output/gl_renderer.cc +++ b/cc/output/gl_renderer.cc @@ -1914,8 +1914,13 @@ void GLRenderer::EnsureScissorTestDisabled() { void GLRenderer::CopyCurrentRenderPassToBitmap( DrawingFrame* frame, scoped_ptr<CopyOutputRequest> request) { - GetFramebufferPixelsAsync(frame->current_render_pass->output_rect, - request.Pass()); + gfx::Rect copy_rect = frame->current_render_pass->output_rect; + if (request->has_area()) { + // Intersect with the request's area, positioned with its origin at the + // origin of the full copy_rect. + copy_rect.Intersect(request->area() - copy_rect.OffsetFromOrigin()); + } + GetFramebufferPixelsAsync(copy_rect, request.Pass()); } void GLRenderer::ToGLMatrix(float* gl_matrix, const gfx::Transform& transform) { diff --git a/cc/output/software_renderer.cc b/cc/output/software_renderer.cc index 3cf1f6a..4b604a8 100644 --- a/cc/output/software_renderer.cc +++ b/cc/output/software_renderer.cc @@ -456,12 +456,20 @@ void SoftwareRenderer::DrawUnsupportedQuad(const DrawingFrame* frame, void SoftwareRenderer::CopyCurrentRenderPassToBitmap( DrawingFrame* frame, scoped_ptr<CopyOutputRequest> request) { + gfx::Rect copy_rect = frame->current_render_pass->output_rect; + if (request->has_area()) { + // Intersect with the request's area, positioned with its origin at the + // origin of the full copy_rect. + copy_rect.Intersect(request->area() - copy_rect.OffsetFromOrigin()); + } + gfx::Rect window_copy_rect = MoveFromDrawToWindowSpace(copy_rect); + scoped_ptr<SkBitmap> bitmap(new SkBitmap); bitmap->setConfig(SkBitmap::kARGB_8888_Config, - current_viewport_rect_.width(), - current_viewport_rect_.height()); + window_copy_rect.width(), + window_copy_rect.height()); current_canvas_->readPixels( - bitmap.get(), current_viewport_rect_.x(), current_viewport_rect_.y()); + bitmap.get(), window_copy_rect.x(), window_copy_rect.y()); request->SendBitmapResult(bitmap.Pass()); } |