Index: ui/compositor/layer_unittest.cc |
diff --git a/ui/compositor/layer_unittest.cc b/ui/compositor/layer_unittest.cc |
index f4e1ab50a800e875aa41df6c6e51ad9a8c1191a2..e10ff807b87c0a207358f39d8ec7c721d4e2e8e1 100644 |
--- a/ui/compositor/layer_unittest.cc |
+++ b/ui/compositor/layer_unittest.cc |
@@ -15,6 +15,8 @@ |
#include "cc/layers/delegated_frame_provider.h" |
#include "cc/layers/delegated_frame_resource_collection.h" |
#include "cc/layers/layer.h" |
+#include "cc/output/copy_output_request.h" |
+#include "cc/output/copy_output_result.h" |
#include "cc/output/delegated_frame_data.h" |
#include "cc/test/pixel_test_utils.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -126,8 +128,29 @@ class LayerWithRealCompositorTest : public testing::Test { |
} |
bool ReadPixels(SkBitmap* bitmap) { |
- return GetCompositor()->ReadPixels(bitmap, |
- gfx::Rect(GetCompositor()->size())); |
+ return ReadPixels(bitmap, gfx::Rect(GetCompositor()->size())); |
+ } |
+ |
+ bool ReadPixels(SkBitmap* bitmap, gfx::Rect source_rect) { |
+ scoped_refptr<ReadbackHolder> holder(new ReadbackHolder); |
+ scoped_ptr<cc::CopyOutputRequest> request = |
+ cc::CopyOutputRequest::CreateBitmapRequest( |
+ base::Bind(&ReadbackHolder::OutputRequestCallback, holder)); |
+ request->set_area(source_rect); |
+ |
+ GetCompositor()->root_layer()->RequestCopyOfOutput(request.Pass()); |
+ |
+ // Wait for copy response. |
+ WaitForDraw(); |
+ |
+ if (holder->completed()) { |
+ *bitmap = holder->result(); |
+ return true; |
+ } |
+ |
+ // Callback never called. |
+ NOTREACHED(); |
+ return false; |
} |
void WaitForDraw() { |
@@ -149,6 +172,29 @@ class LayerWithRealCompositorTest : public testing::Test { |
} |
private: |
+ class ReadbackHolder : public base::RefCountedThreadSafe<ReadbackHolder> { |
+ public: |
+ ReadbackHolder() : completed_(false) {} |
+ |
+ void OutputRequestCallback(scoped_ptr<cc::CopyOutputResult> result) { |
+ DCHECK(!completed_); |
+ result_ = result->TakeBitmap(); |
+ completed_ = true; |
+ } |
+ bool completed() const { |
+ return completed_; |
+ }; |
+ const SkBitmap& result() const { return *result_.get(); } |
danakj
2014/01/17 17:36:36
can't you just do *result?
enne (OOO)
2014/01/17 17:51:13
I don't think so, since result is a scoped_ptr.
enne (OOO)
2014/01/17 17:52:27
By which I mean I misunderstood what you were aski
|
+ |
+ private: |
+ friend class base::RefCountedThreadSafe<ReadbackHolder>; |
+ |
+ virtual ~ReadbackHolder() {} |
+ |
+ scoped_ptr<SkBitmap> result_; |
+ bool completed_; |
+ }; |
+ |
scoped_ptr<TestCompositorHost> window_; |
// The root directory for test files. |
@@ -783,7 +829,7 @@ TEST_F(LayerWithRealCompositorTest, DrawPixels) { |
DrawTree(layer.get()); |
SkBitmap bitmap; |
- ASSERT_TRUE(GetCompositor()->ReadPixels(&bitmap, gfx::Rect(viewport_size))); |
+ ASSERT_TRUE(ReadPixels(&bitmap, gfx::Rect(viewport_size))); |
ASSERT_FALSE(bitmap.empty()); |
SkAutoLockPixels lock(bitmap); |