Index: cc/output/software_renderer_unittest.cc |
diff --git a/cc/output/software_renderer_unittest.cc b/cc/output/software_renderer_unittest.cc |
index af4343b42c589f69d23c74be8079a135fe763704..ee5af29f991b7169dbdd4a8f2c1b5ec7592c1358 100644 |
--- a/cc/output/software_renderer_unittest.cc |
+++ b/cc/output/software_renderer_unittest.cc |
@@ -4,8 +4,11 @@ |
#include "cc/output/software_renderer.h" |
+#include "base/run_loop.h" |
#include "cc/layers/quad_sink.h" |
#include "cc/output/compositor_frame_metadata.h" |
+#include "cc/output/copy_output_request.h" |
+#include "cc/output/copy_output_result.h" |
#include "cc/output/software_output_device.h" |
#include "cc/quads/render_pass.h" |
#include "cc/quads/render_pass_draw_quad.h" |
@@ -50,6 +53,35 @@ class SoftwareRendererTest : public testing::Test, public RendererClient { |
// RendererClient implementation. |
virtual void SetFullRootLayerDamage() OVERRIDE {} |
+ scoped_ptr<SkBitmap> DrawAndCopyOutput(RenderPassList* list, |
+ float device_scale_factor, |
+ gfx::Rect device_viewport_rect) { |
+ scoped_ptr<SkBitmap> bitmap_result; |
+ base::RunLoop loop; |
+ |
+ list->back()->copy_requests.push_back( |
+ CopyOutputRequest::CreateBitmapRequest( |
+ base::Bind(&SoftwareRendererTest::SaveBitmapResult, |
+ base::Unretained(&bitmap_result), |
+ loop.QuitClosure()))); |
+ |
+ renderer()->DrawFrame(list, |
+ device_scale_factor, |
+ device_viewport_rect, |
+ device_viewport_rect, |
+ false); |
+ loop.Run(); |
+ return bitmap_result.Pass(); |
+ } |
+ |
+ static void SaveBitmapResult(scoped_ptr<SkBitmap>* bitmap_result, |
+ const base::Closure& quit_closure, |
+ scoped_ptr<CopyOutputResult> result) { |
+ DCHECK(result->HasBitmap()); |
+ *bitmap_result = result->TakeBitmap(); |
+ quit_closure.Run(); |
+ } |
+ |
protected: |
LayerTreeSettings settings_; |
FakeOutputSurfaceClient output_surface_client_; |
@@ -96,25 +128,18 @@ TEST_F(SoftwareRendererTest, SolidColorQuad) { |
float device_scale_factor = 1.f; |
gfx::Rect device_viewport_rect(outer_size); |
- renderer()->DrawFrame(&list, |
- device_scale_factor, |
- device_viewport_rect, |
- device_viewport_rect, |
- false); |
- |
- SkBitmap output; |
- output.setConfig( |
- SkBitmap::kARGB_8888_Config, outer_rect.width(), outer_rect.height()); |
- output.allocPixels(); |
- renderer()->GetFramebufferPixels(output.getPixels(), outer_rect); |
- |
- EXPECT_EQ(SK_ColorYELLOW, output.getColor(0, 0)); |
+ scoped_ptr<SkBitmap> output = |
+ DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); |
+ EXPECT_EQ(outer_rect.width(), output->info().fWidth); |
+ EXPECT_EQ(outer_rect.width(), output->info().fHeight); |
+ |
+ EXPECT_EQ(SK_ColorYELLOW, output->getColor(0, 0)); |
EXPECT_EQ(SK_ColorYELLOW, |
- output.getColor(outer_size.width() - 1, outer_size.height() - 1)); |
- EXPECT_EQ(SK_ColorYELLOW, output.getColor(1, 1)); |
- EXPECT_EQ(SK_ColorCYAN, output.getColor(1, 2)); |
+ output->getColor(outer_size.width() - 1, outer_size.height() - 1)); |
+ EXPECT_EQ(SK_ColorYELLOW, output->getColor(1, 1)); |
+ EXPECT_EQ(SK_ColorCYAN, output->getColor(1, 2)); |
EXPECT_EQ(SK_ColorCYAN, |
- output.getColor(inner_size.width() - 1, inner_size.height() - 1)); |
+ output->getColor(inner_size.width() - 1, inner_size.height() - 1)); |
} |
TEST_F(SoftwareRendererTest, TileQuad) { |
@@ -200,24 +225,17 @@ TEST_F(SoftwareRendererTest, TileQuad) { |
float device_scale_factor = 1.f; |
gfx::Rect device_viewport_rect(outer_size); |
- renderer()->DrawFrame(&list, |
- device_scale_factor, |
- device_viewport_rect, |
- device_viewport_rect, |
- false); |
- |
- SkBitmap output; |
- output.setConfig( |
- SkBitmap::kARGB_8888_Config, outer_size.width(), outer_size.height()); |
- output.allocPixels(); |
- renderer()->GetFramebufferPixels(output.getPixels(), outer_rect); |
+ scoped_ptr<SkBitmap> output = |
+ DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); |
+ EXPECT_EQ(outer_rect.width(), output->info().fWidth); |
+ EXPECT_EQ(outer_rect.width(), output->info().fHeight); |
- EXPECT_EQ(SK_ColorYELLOW, output.getColor(0, 0)); |
+ EXPECT_EQ(SK_ColorYELLOW, output->getColor(0, 0)); |
EXPECT_EQ(SK_ColorYELLOW, |
- output.getColor(outer_size.width() - 1, outer_size.height() - 1)); |
- EXPECT_EQ(SK_ColorCYAN, output.getColor(1, 1)); |
+ output->getColor(outer_size.width() - 1, outer_size.height() - 1)); |
+ EXPECT_EQ(SK_ColorCYAN, output->getColor(1, 1)); |
EXPECT_EQ(SK_ColorCYAN, |
- output.getColor(inner_size.width() - 1, inner_size.height() - 1)); |
+ output->getColor(inner_size.width() - 1, inner_size.height() - 1)); |
} |
TEST_F(SoftwareRendererTest, TileQuadVisibleRect) { |
@@ -281,70 +299,57 @@ TEST_F(SoftwareRendererTest, TileQuadVisibleRect) { |
float device_scale_factor = 1.f; |
gfx::Rect device_viewport_rect(tile_size); |
- renderer()->DrawFrame(&list, |
- device_scale_factor, |
- device_viewport_rect, |
- device_viewport_rect, |
- false); |
- |
- SkBitmap output; |
- output.setConfig( |
- SkBitmap::kARGB_8888_Config, tile_size.width(), tile_size.height()); |
- output.allocPixels(); |
- renderer()->GetFramebufferPixels(output.getPixels(), tile_rect); |
+ scoped_ptr<SkBitmap> output = |
+ DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); |
+ EXPECT_EQ(tile_rect.width(), output->info().fWidth); |
+ EXPECT_EQ(tile_rect.width(), output->info().fHeight); |
// Check portion of tile not in visible rect isn't drawn. |
const unsigned int kTransparent = SK_ColorTRANSPARENT; |
- EXPECT_EQ(kTransparent, output.getColor(0, 0)); |
+ EXPECT_EQ(kTransparent, output->getColor(0, 0)); |
EXPECT_EQ(kTransparent, |
- output.getColor(tile_rect.width() - 1, tile_rect.height() - 1)); |
+ output->getColor(tile_rect.width() - 1, tile_rect.height() - 1)); |
EXPECT_EQ(kTransparent, |
- output.getColor(visible_rect.x() - 1, visible_rect.y() - 1)); |
+ output->getColor(visible_rect.x() - 1, visible_rect.y() - 1)); |
EXPECT_EQ(kTransparent, |
- output.getColor(visible_rect.right(), visible_rect.bottom())); |
+ output->getColor(visible_rect.right(), visible_rect.bottom())); |
// Ensure visible part is drawn correctly. |
- EXPECT_EQ(SK_ColorCYAN, output.getColor(visible_rect.x(), visible_rect.y())); |
+ EXPECT_EQ(SK_ColorCYAN, output->getColor(visible_rect.x(), visible_rect.y())); |
EXPECT_EQ( |
SK_ColorCYAN, |
- output.getColor(visible_rect.right() - 2, visible_rect.bottom() - 2)); |
+ output->getColor(visible_rect.right() - 2, visible_rect.bottom() - 2)); |
// Ensure last visible line is correct. |
EXPECT_EQ( |
SK_ColorYELLOW, |
- output.getColor(visible_rect.right() - 1, visible_rect.bottom() - 1)); |
+ output->getColor(visible_rect.right() - 1, visible_rect.bottom() - 1)); |
} |
TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) { |
float device_scale_factor = 1.f; |
- gfx::Rect viewport_rect(0, 0, 100, 100); |
+ gfx::Rect device_viewport_rect(0, 0, 100, 100); |
settings_.should_clear_root_render_pass = false; |
InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); |
RenderPassList list; |
- SkBitmap output; |
- output.setConfig(SkBitmap::kARGB_8888_Config, |
- viewport_rect.width(), |
- viewport_rect.height()); |
- output.allocPixels(); |
- |
// Draw a fullscreen green quad in a first frame. |
RenderPass::Id root_clear_pass_id(1, 0); |
TestRenderPass* root_clear_pass = AddRenderPass( |
- &list, root_clear_pass_id, viewport_rect, gfx::Transform()); |
- AddQuad(root_clear_pass, viewport_rect, SK_ColorGREEN); |
+ &list, root_clear_pass_id, device_viewport_rect, gfx::Transform()); |
+ AddQuad(root_clear_pass, device_viewport_rect, SK_ColorGREEN); |
renderer()->DecideRenderPassAllocationsForFrame(list); |
- renderer()->DrawFrame(&list, |
- device_scale_factor, |
- viewport_rect, |
- viewport_rect, |
- false); |
- renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect); |
- |
- EXPECT_EQ(SK_ColorGREEN, output.getColor(0, 0)); |
+ |
+ scoped_ptr<SkBitmap> output = |
+ DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); |
+ EXPECT_EQ(device_viewport_rect.width(), output->info().fWidth); |
+ EXPECT_EQ(device_viewport_rect.width(), output->info().fHeight); |
+ |
+ EXPECT_EQ(SK_ColorGREEN, output->getColor(0, 0)); |
EXPECT_EQ(SK_ColorGREEN, |
- output.getColor(viewport_rect.width() - 1, viewport_rect.height() - 1)); |
+ output->getColor(device_viewport_rect.width() - 1, |
+ device_viewport_rect.height() - 1)); |
list.clear(); |
@@ -354,41 +359,35 @@ TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) { |
RenderPass::Id root_smaller_pass_id(2, 0); |
TestRenderPass* root_smaller_pass = AddRenderPass( |
- &list, root_smaller_pass_id, viewport_rect, gfx::Transform()); |
+ &list, root_smaller_pass_id, device_viewport_rect, gfx::Transform()); |
AddQuad(root_smaller_pass, smaller_rect, SK_ColorMAGENTA); |
renderer()->DecideRenderPassAllocationsForFrame(list); |
- renderer()->DrawFrame(&list, |
- device_scale_factor, |
- viewport_rect, |
- viewport_rect, |
- false); |
- renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect); |
+ |
+ output = DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); |
+ EXPECT_EQ(device_viewport_rect.width(), output->info().fWidth); |
+ EXPECT_EQ(device_viewport_rect.width(), output->info().fHeight); |
// If we didn't clear, the borders should still be green. |
- EXPECT_EQ(SK_ColorGREEN, output.getColor(0, 0)); |
+ EXPECT_EQ(SK_ColorGREEN, output->getColor(0, 0)); |
EXPECT_EQ(SK_ColorGREEN, |
- output.getColor(viewport_rect.width() - 1, viewport_rect.height() - 1)); |
+ output->getColor(device_viewport_rect.width() - 1, |
+ device_viewport_rect.height() - 1)); |
EXPECT_EQ(SK_ColorMAGENTA, |
- output.getColor(smaller_rect.x(), smaller_rect.y())); |
- EXPECT_EQ(SK_ColorMAGENTA, |
- output.getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); |
+ output->getColor(smaller_rect.x(), smaller_rect.y())); |
+ EXPECT_EQ( |
+ SK_ColorMAGENTA, |
+ output->getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); |
} |
TEST_F(SoftwareRendererTest, RenderPassVisibleRect) { |
float device_scale_factor = 1.f; |
- gfx::Rect viewport_rect(0, 0, 100, 100); |
+ gfx::Rect device_viewport_rect(0, 0, 100, 100); |
InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); |
RenderPassList list; |
- SkBitmap output; |
- output.setConfig(SkBitmap::kARGB_8888_Config, |
- viewport_rect.width(), |
- viewport_rect.height()); |
- output.allocPixels(); |
- |
// Pass drawn as inner quad is magenta. |
gfx::Rect smaller_rect(20, 20, 60, 60); |
RenderPass::Id smaller_pass_id(2, 1); |
@@ -398,40 +397,40 @@ TEST_F(SoftwareRendererTest, RenderPassVisibleRect) { |
// Root pass is green. |
RenderPass::Id root_clear_pass_id(1, 0); |
- TestRenderPass* root_clear_pass = |
- AddRenderPass(&list, root_clear_pass_id, viewport_rect, gfx::Transform()); |
+ TestRenderPass* root_clear_pass = AddRenderPass( |
+ &list, root_clear_pass_id, device_viewport_rect, gfx::Transform()); |
AddRenderPassQuad(root_clear_pass, smaller_pass); |
- AddQuad(root_clear_pass, viewport_rect, SK_ColorGREEN); |
+ AddQuad(root_clear_pass, device_viewport_rect, SK_ColorGREEN); |
// Interior pass quad has smaller visible rect. |
gfx::Rect interior_visible_rect(30, 30, 40, 40); |
root_clear_pass->quad_list[0]->visible_rect = interior_visible_rect; |
renderer()->DecideRenderPassAllocationsForFrame(list); |
- renderer()->DrawFrame(&list, |
- device_scale_factor, |
- viewport_rect, |
- viewport_rect, |
- false); |
- renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect); |
- |
- EXPECT_EQ(SK_ColorGREEN, output.getColor(0, 0)); |
- EXPECT_EQ( |
- SK_ColorGREEN, |
- output.getColor(viewport_rect.width() - 1, viewport_rect.height() - 1)); |
+ |
+ scoped_ptr<SkBitmap> output = |
+ DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); |
+ EXPECT_EQ(device_viewport_rect.width(), output->info().fWidth); |
+ EXPECT_EQ(device_viewport_rect.width(), output->info().fHeight); |
+ |
+ EXPECT_EQ(SK_ColorGREEN, output->getColor(0, 0)); |
+ EXPECT_EQ(SK_ColorGREEN, |
+ output->getColor(device_viewport_rect.width() - 1, |
+ device_viewport_rect.height() - 1)); |
// Part outside visible rect should remain green. |
- EXPECT_EQ(SK_ColorGREEN, output.getColor(smaller_rect.x(), smaller_rect.y())); |
+ EXPECT_EQ(SK_ColorGREEN, |
+ output->getColor(smaller_rect.x(), smaller_rect.y())); |
EXPECT_EQ( |
SK_ColorGREEN, |
- output.getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); |
+ output->getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); |
EXPECT_EQ( |
SK_ColorMAGENTA, |
- output.getColor(interior_visible_rect.x(), interior_visible_rect.y())); |
+ output->getColor(interior_visible_rect.x(), interior_visible_rect.y())); |
EXPECT_EQ(SK_ColorMAGENTA, |
- output.getColor(interior_visible_rect.right() - 1, |
- interior_visible_rect.bottom() - 1)); |
+ output->getColor(interior_visible_rect.right() - 1, |
+ interior_visible_rect.bottom() - 1)); |
} |
} // namespace |