| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/output/software_renderer.h" | 5 #include "cc/output/software_renderer.h" |
| 6 | 6 |
| 7 #include "base/run_loop.h" |
| 7 #include "cc/layers/quad_sink.h" | 8 #include "cc/layers/quad_sink.h" |
| 8 #include "cc/output/compositor_frame_metadata.h" | 9 #include "cc/output/compositor_frame_metadata.h" |
| 10 #include "cc/output/copy_output_request.h" |
| 11 #include "cc/output/copy_output_result.h" |
| 9 #include "cc/output/software_output_device.h" | 12 #include "cc/output/software_output_device.h" |
| 10 #include "cc/quads/render_pass.h" | 13 #include "cc/quads/render_pass.h" |
| 11 #include "cc/quads/render_pass_draw_quad.h" | 14 #include "cc/quads/render_pass_draw_quad.h" |
| 12 #include "cc/quads/solid_color_draw_quad.h" | 15 #include "cc/quads/solid_color_draw_quad.h" |
| 13 #include "cc/quads/tile_draw_quad.h" | 16 #include "cc/quads/tile_draw_quad.h" |
| 14 #include "cc/test/animation_test_common.h" | 17 #include "cc/test/animation_test_common.h" |
| 15 #include "cc/test/fake_output_surface.h" | 18 #include "cc/test/fake_output_surface.h" |
| 16 #include "cc/test/fake_output_surface_client.h" | 19 #include "cc/test/fake_output_surface_client.h" |
| 17 #include "cc/test/geometry_test_utils.h" | 20 #include "cc/test/geometry_test_utils.h" |
| 18 #include "cc/test/render_pass_test_common.h" | 21 #include "cc/test/render_pass_test_common.h" |
| (...skipping 24 matching lines...) Expand all Loading... |
| 43 | 46 |
| 44 ResourceProvider* resource_provider() const { | 47 ResourceProvider* resource_provider() const { |
| 45 return resource_provider_.get(); | 48 return resource_provider_.get(); |
| 46 } | 49 } |
| 47 | 50 |
| 48 SoftwareRenderer* renderer() const { return renderer_.get(); } | 51 SoftwareRenderer* renderer() const { return renderer_.get(); } |
| 49 | 52 |
| 50 // RendererClient implementation. | 53 // RendererClient implementation. |
| 51 virtual void SetFullRootLayerDamage() OVERRIDE {} | 54 virtual void SetFullRootLayerDamage() OVERRIDE {} |
| 52 | 55 |
| 56 scoped_ptr<SkBitmap> DrawAndCopyOutput(RenderPassList* list, |
| 57 float device_scale_factor, |
| 58 gfx::Rect device_viewport_rect) { |
| 59 scoped_ptr<SkBitmap> bitmap_result; |
| 60 base::RunLoop loop; |
| 61 |
| 62 list->back()->copy_requests.push_back( |
| 63 CopyOutputRequest::CreateBitmapRequest( |
| 64 base::Bind(&SoftwareRendererTest::SaveBitmapResult, |
| 65 base::Unretained(&bitmap_result), |
| 66 loop.QuitClosure()))); |
| 67 |
| 68 renderer()->DrawFrame(list, |
| 69 device_scale_factor, |
| 70 device_viewport_rect, |
| 71 device_viewport_rect, |
| 72 false); |
| 73 loop.Run(); |
| 74 return bitmap_result.Pass(); |
| 75 } |
| 76 |
| 77 static void SaveBitmapResult(scoped_ptr<SkBitmap>* bitmap_result, |
| 78 const base::Closure& quit_closure, |
| 79 scoped_ptr<CopyOutputResult> result) { |
| 80 DCHECK(result->HasBitmap()); |
| 81 *bitmap_result = result->TakeBitmap(); |
| 82 quit_closure.Run(); |
| 83 } |
| 84 |
| 53 protected: | 85 protected: |
| 54 LayerTreeSettings settings_; | 86 LayerTreeSettings settings_; |
| 55 FakeOutputSurfaceClient output_surface_client_; | 87 FakeOutputSurfaceClient output_surface_client_; |
| 56 scoped_ptr<FakeOutputSurface> output_surface_; | 88 scoped_ptr<FakeOutputSurface> output_surface_; |
| 57 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; | 89 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; |
| 58 scoped_ptr<ResourceProvider> resource_provider_; | 90 scoped_ptr<ResourceProvider> resource_provider_; |
| 59 scoped_ptr<SoftwareRenderer> renderer_; | 91 scoped_ptr<SoftwareRenderer> renderer_; |
| 60 }; | 92 }; |
| 61 | 93 |
| 62 TEST_F(SoftwareRendererTest, SolidColorQuad) { | 94 TEST_F(SoftwareRendererTest, SolidColorQuad) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 89 shared_quad_state, inner_rect, inner_rect, SK_ColorCYAN, false); | 121 shared_quad_state, inner_rect, inner_rect, SK_ColorCYAN, false); |
| 90 inner_quad->visible_rect = visible_rect; | 122 inner_quad->visible_rect = visible_rect; |
| 91 root_render_pass->AppendQuad(inner_quad.PassAs<DrawQuad>()); | 123 root_render_pass->AppendQuad(inner_quad.PassAs<DrawQuad>()); |
| 92 root_render_pass->AppendQuad(outer_quad.PassAs<DrawQuad>()); | 124 root_render_pass->AppendQuad(outer_quad.PassAs<DrawQuad>()); |
| 93 | 125 |
| 94 RenderPassList list; | 126 RenderPassList list; |
| 95 list.push_back(root_render_pass.PassAs<RenderPass>()); | 127 list.push_back(root_render_pass.PassAs<RenderPass>()); |
| 96 | 128 |
| 97 float device_scale_factor = 1.f; | 129 float device_scale_factor = 1.f; |
| 98 gfx::Rect device_viewport_rect(outer_size); | 130 gfx::Rect device_viewport_rect(outer_size); |
| 99 renderer()->DrawFrame(&list, | 131 scoped_ptr<SkBitmap> output = |
| 100 device_scale_factor, | 132 DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); |
| 101 device_viewport_rect, | 133 EXPECT_EQ(outer_rect.width(), output->info().fWidth); |
| 102 device_viewport_rect, | 134 EXPECT_EQ(outer_rect.width(), output->info().fHeight); |
| 103 false); | |
| 104 | 135 |
| 105 SkBitmap output; | 136 EXPECT_EQ(SK_ColorYELLOW, output->getColor(0, 0)); |
| 106 output.setConfig( | |
| 107 SkBitmap::kARGB_8888_Config, outer_rect.width(), outer_rect.height()); | |
| 108 output.allocPixels(); | |
| 109 renderer()->GetFramebufferPixels(output.getPixels(), outer_rect); | |
| 110 | |
| 111 EXPECT_EQ(SK_ColorYELLOW, output.getColor(0, 0)); | |
| 112 EXPECT_EQ(SK_ColorYELLOW, | 137 EXPECT_EQ(SK_ColorYELLOW, |
| 113 output.getColor(outer_size.width() - 1, outer_size.height() - 1)); | 138 output->getColor(outer_size.width() - 1, outer_size.height() - 1)); |
| 114 EXPECT_EQ(SK_ColorYELLOW, output.getColor(1, 1)); | 139 EXPECT_EQ(SK_ColorYELLOW, output->getColor(1, 1)); |
| 115 EXPECT_EQ(SK_ColorCYAN, output.getColor(1, 2)); | 140 EXPECT_EQ(SK_ColorCYAN, output->getColor(1, 2)); |
| 116 EXPECT_EQ(SK_ColorCYAN, | 141 EXPECT_EQ(SK_ColorCYAN, |
| 117 output.getColor(inner_size.width() - 1, inner_size.height() - 1)); | 142 output->getColor(inner_size.width() - 1, inner_size.height() - 1)); |
| 118 } | 143 } |
| 119 | 144 |
| 120 TEST_F(SoftwareRendererTest, TileQuad) { | 145 TEST_F(SoftwareRendererTest, TileQuad) { |
| 121 gfx::Size outer_size(100, 100); | 146 gfx::Size outer_size(100, 100); |
| 122 gfx::Size inner_size(98, 98); | 147 gfx::Size inner_size(98, 98); |
| 123 gfx::Rect outer_rect(outer_size); | 148 gfx::Rect outer_rect(outer_size); |
| 124 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size); | 149 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size); |
| 125 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); | 150 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); |
| 126 | 151 |
| 127 ResourceProvider::ResourceId resource_yellow = | 152 ResourceProvider::ResourceId resource_yellow = |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 inner_size, | 218 inner_size, |
| 194 false); | 219 false); |
| 195 root_render_pass->AppendQuad(inner_quad.PassAs<DrawQuad>()); | 220 root_render_pass->AppendQuad(inner_quad.PassAs<DrawQuad>()); |
| 196 root_render_pass->AppendQuad(outer_quad.PassAs<DrawQuad>()); | 221 root_render_pass->AppendQuad(outer_quad.PassAs<DrawQuad>()); |
| 197 | 222 |
| 198 RenderPassList list; | 223 RenderPassList list; |
| 199 list.push_back(root_render_pass.PassAs<RenderPass>()); | 224 list.push_back(root_render_pass.PassAs<RenderPass>()); |
| 200 | 225 |
| 201 float device_scale_factor = 1.f; | 226 float device_scale_factor = 1.f; |
| 202 gfx::Rect device_viewport_rect(outer_size); | 227 gfx::Rect device_viewport_rect(outer_size); |
| 203 renderer()->DrawFrame(&list, | 228 scoped_ptr<SkBitmap> output = |
| 204 device_scale_factor, | 229 DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); |
| 205 device_viewport_rect, | 230 EXPECT_EQ(outer_rect.width(), output->info().fWidth); |
| 206 device_viewport_rect, | 231 EXPECT_EQ(outer_rect.width(), output->info().fHeight); |
| 207 false); | |
| 208 | 232 |
| 209 SkBitmap output; | 233 EXPECT_EQ(SK_ColorYELLOW, output->getColor(0, 0)); |
| 210 output.setConfig( | |
| 211 SkBitmap::kARGB_8888_Config, outer_size.width(), outer_size.height()); | |
| 212 output.allocPixels(); | |
| 213 renderer()->GetFramebufferPixels(output.getPixels(), outer_rect); | |
| 214 | |
| 215 EXPECT_EQ(SK_ColorYELLOW, output.getColor(0, 0)); | |
| 216 EXPECT_EQ(SK_ColorYELLOW, | 234 EXPECT_EQ(SK_ColorYELLOW, |
| 217 output.getColor(outer_size.width() - 1, outer_size.height() - 1)); | 235 output->getColor(outer_size.width() - 1, outer_size.height() - 1)); |
| 218 EXPECT_EQ(SK_ColorCYAN, output.getColor(1, 1)); | 236 EXPECT_EQ(SK_ColorCYAN, output->getColor(1, 1)); |
| 219 EXPECT_EQ(SK_ColorCYAN, | 237 EXPECT_EQ(SK_ColorCYAN, |
| 220 output.getColor(inner_size.width() - 1, inner_size.height() - 1)); | 238 output->getColor(inner_size.width() - 1, inner_size.height() - 1)); |
| 221 } | 239 } |
| 222 | 240 |
| 223 TEST_F(SoftwareRendererTest, TileQuadVisibleRect) { | 241 TEST_F(SoftwareRendererTest, TileQuadVisibleRect) { |
| 224 gfx::Size tile_size(100, 100); | 242 gfx::Size tile_size(100, 100); |
| 225 gfx::Rect tile_rect(tile_size); | 243 gfx::Rect tile_rect(tile_size); |
| 226 gfx::Rect visible_rect = tile_rect; | 244 gfx::Rect visible_rect = tile_rect; |
| 227 visible_rect.Inset(1, 2, 3, 4); | 245 visible_rect.Inset(1, 2, 3, 4); |
| 228 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); | 246 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); |
| 229 | 247 |
| 230 ResourceProvider::ResourceId resource_cyan = | 248 ResourceProvider::ResourceId resource_cyan = |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 tile_size, | 292 tile_size, |
| 275 false); | 293 false); |
| 276 quad->visible_rect = visible_rect; | 294 quad->visible_rect = visible_rect; |
| 277 root_render_pass->AppendQuad(quad.PassAs<DrawQuad>()); | 295 root_render_pass->AppendQuad(quad.PassAs<DrawQuad>()); |
| 278 | 296 |
| 279 RenderPassList list; | 297 RenderPassList list; |
| 280 list.push_back(root_render_pass.PassAs<RenderPass>()); | 298 list.push_back(root_render_pass.PassAs<RenderPass>()); |
| 281 | 299 |
| 282 float device_scale_factor = 1.f; | 300 float device_scale_factor = 1.f; |
| 283 gfx::Rect device_viewport_rect(tile_size); | 301 gfx::Rect device_viewport_rect(tile_size); |
| 284 renderer()->DrawFrame(&list, | 302 scoped_ptr<SkBitmap> output = |
| 285 device_scale_factor, | 303 DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); |
| 286 device_viewport_rect, | 304 EXPECT_EQ(tile_rect.width(), output->info().fWidth); |
| 287 device_viewport_rect, | 305 EXPECT_EQ(tile_rect.width(), output->info().fHeight); |
| 288 false); | |
| 289 | |
| 290 SkBitmap output; | |
| 291 output.setConfig( | |
| 292 SkBitmap::kARGB_8888_Config, tile_size.width(), tile_size.height()); | |
| 293 output.allocPixels(); | |
| 294 renderer()->GetFramebufferPixels(output.getPixels(), tile_rect); | |
| 295 | 306 |
| 296 // Check portion of tile not in visible rect isn't drawn. | 307 // Check portion of tile not in visible rect isn't drawn. |
| 297 const unsigned int kTransparent = SK_ColorTRANSPARENT; | 308 const unsigned int kTransparent = SK_ColorTRANSPARENT; |
| 298 EXPECT_EQ(kTransparent, output.getColor(0, 0)); | 309 EXPECT_EQ(kTransparent, output->getColor(0, 0)); |
| 299 EXPECT_EQ(kTransparent, | 310 EXPECT_EQ(kTransparent, |
| 300 output.getColor(tile_rect.width() - 1, tile_rect.height() - 1)); | 311 output->getColor(tile_rect.width() - 1, tile_rect.height() - 1)); |
| 301 EXPECT_EQ(kTransparent, | 312 EXPECT_EQ(kTransparent, |
| 302 output.getColor(visible_rect.x() - 1, visible_rect.y() - 1)); | 313 output->getColor(visible_rect.x() - 1, visible_rect.y() - 1)); |
| 303 EXPECT_EQ(kTransparent, | 314 EXPECT_EQ(kTransparent, |
| 304 output.getColor(visible_rect.right(), visible_rect.bottom())); | 315 output->getColor(visible_rect.right(), visible_rect.bottom())); |
| 305 // Ensure visible part is drawn correctly. | 316 // Ensure visible part is drawn correctly. |
| 306 EXPECT_EQ(SK_ColorCYAN, output.getColor(visible_rect.x(), visible_rect.y())); | 317 EXPECT_EQ(SK_ColorCYAN, output->getColor(visible_rect.x(), visible_rect.y())); |
| 307 EXPECT_EQ( | 318 EXPECT_EQ( |
| 308 SK_ColorCYAN, | 319 SK_ColorCYAN, |
| 309 output.getColor(visible_rect.right() - 2, visible_rect.bottom() - 2)); | 320 output->getColor(visible_rect.right() - 2, visible_rect.bottom() - 2)); |
| 310 // Ensure last visible line is correct. | 321 // Ensure last visible line is correct. |
| 311 EXPECT_EQ( | 322 EXPECT_EQ( |
| 312 SK_ColorYELLOW, | 323 SK_ColorYELLOW, |
| 313 output.getColor(visible_rect.right() - 1, visible_rect.bottom() - 1)); | 324 output->getColor(visible_rect.right() - 1, visible_rect.bottom() - 1)); |
| 314 } | 325 } |
| 315 | 326 |
| 316 TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) { | 327 TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) { |
| 317 float device_scale_factor = 1.f; | 328 float device_scale_factor = 1.f; |
| 318 gfx::Rect viewport_rect(0, 0, 100, 100); | 329 gfx::Rect device_viewport_rect(0, 0, 100, 100); |
| 319 | 330 |
| 320 settings_.should_clear_root_render_pass = false; | 331 settings_.should_clear_root_render_pass = false; |
| 321 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); | 332 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); |
| 322 | 333 |
| 323 RenderPassList list; | 334 RenderPassList list; |
| 324 | 335 |
| 325 SkBitmap output; | |
| 326 output.setConfig(SkBitmap::kARGB_8888_Config, | |
| 327 viewport_rect.width(), | |
| 328 viewport_rect.height()); | |
| 329 output.allocPixels(); | |
| 330 | |
| 331 // Draw a fullscreen green quad in a first frame. | 336 // Draw a fullscreen green quad in a first frame. |
| 332 RenderPass::Id root_clear_pass_id(1, 0); | 337 RenderPass::Id root_clear_pass_id(1, 0); |
| 333 TestRenderPass* root_clear_pass = AddRenderPass( | 338 TestRenderPass* root_clear_pass = AddRenderPass( |
| 334 &list, root_clear_pass_id, viewport_rect, gfx::Transform()); | 339 &list, root_clear_pass_id, device_viewport_rect, gfx::Transform()); |
| 335 AddQuad(root_clear_pass, viewport_rect, SK_ColorGREEN); | 340 AddQuad(root_clear_pass, device_viewport_rect, SK_ColorGREEN); |
| 336 | 341 |
| 337 renderer()->DecideRenderPassAllocationsForFrame(list); | 342 renderer()->DecideRenderPassAllocationsForFrame(list); |
| 338 renderer()->DrawFrame(&list, | |
| 339 device_scale_factor, | |
| 340 viewport_rect, | |
| 341 viewport_rect, | |
| 342 false); | |
| 343 renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect); | |
| 344 | 343 |
| 345 EXPECT_EQ(SK_ColorGREEN, output.getColor(0, 0)); | 344 scoped_ptr<SkBitmap> output = |
| 345 DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); |
| 346 EXPECT_EQ(device_viewport_rect.width(), output->info().fWidth); |
| 347 EXPECT_EQ(device_viewport_rect.width(), output->info().fHeight); |
| 348 |
| 349 EXPECT_EQ(SK_ColorGREEN, output->getColor(0, 0)); |
| 346 EXPECT_EQ(SK_ColorGREEN, | 350 EXPECT_EQ(SK_ColorGREEN, |
| 347 output.getColor(viewport_rect.width() - 1, viewport_rect.height() - 1)); | 351 output->getColor(device_viewport_rect.width() - 1, |
| 352 device_viewport_rect.height() - 1)); |
| 348 | 353 |
| 349 list.clear(); | 354 list.clear(); |
| 350 | 355 |
| 351 // Draw a smaller magenta rect without filling the viewport in a separate | 356 // Draw a smaller magenta rect without filling the viewport in a separate |
| 352 // frame. | 357 // frame. |
| 353 gfx::Rect smaller_rect(20, 20, 60, 60); | 358 gfx::Rect smaller_rect(20, 20, 60, 60); |
| 354 | 359 |
| 355 RenderPass::Id root_smaller_pass_id(2, 0); | 360 RenderPass::Id root_smaller_pass_id(2, 0); |
| 356 TestRenderPass* root_smaller_pass = AddRenderPass( | 361 TestRenderPass* root_smaller_pass = AddRenderPass( |
| 357 &list, root_smaller_pass_id, viewport_rect, gfx::Transform()); | 362 &list, root_smaller_pass_id, device_viewport_rect, gfx::Transform()); |
| 358 AddQuad(root_smaller_pass, smaller_rect, SK_ColorMAGENTA); | 363 AddQuad(root_smaller_pass, smaller_rect, SK_ColorMAGENTA); |
| 359 | 364 |
| 360 renderer()->DecideRenderPassAllocationsForFrame(list); | 365 renderer()->DecideRenderPassAllocationsForFrame(list); |
| 361 renderer()->DrawFrame(&list, | 366 |
| 362 device_scale_factor, | 367 output = DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); |
| 363 viewport_rect, | 368 EXPECT_EQ(device_viewport_rect.width(), output->info().fWidth); |
| 364 viewport_rect, | 369 EXPECT_EQ(device_viewport_rect.width(), output->info().fHeight); |
| 365 false); | |
| 366 renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect); | |
| 367 | 370 |
| 368 // If we didn't clear, the borders should still be green. | 371 // If we didn't clear, the borders should still be green. |
| 369 EXPECT_EQ(SK_ColorGREEN, output.getColor(0, 0)); | 372 EXPECT_EQ(SK_ColorGREEN, output->getColor(0, 0)); |
| 370 EXPECT_EQ(SK_ColorGREEN, | 373 EXPECT_EQ(SK_ColorGREEN, |
| 371 output.getColor(viewport_rect.width() - 1, viewport_rect.height() - 1)); | 374 output->getColor(device_viewport_rect.width() - 1, |
| 375 device_viewport_rect.height() - 1)); |
| 372 | 376 |
| 373 EXPECT_EQ(SK_ColorMAGENTA, | 377 EXPECT_EQ(SK_ColorMAGENTA, |
| 374 output.getColor(smaller_rect.x(), smaller_rect.y())); | 378 output->getColor(smaller_rect.x(), smaller_rect.y())); |
| 375 EXPECT_EQ(SK_ColorMAGENTA, | 379 EXPECT_EQ( |
| 376 output.getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); | 380 SK_ColorMAGENTA, |
| 381 output->getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); |
| 377 } | 382 } |
| 378 | 383 |
| 379 TEST_F(SoftwareRendererTest, RenderPassVisibleRect) { | 384 TEST_F(SoftwareRendererTest, RenderPassVisibleRect) { |
| 380 float device_scale_factor = 1.f; | 385 float device_scale_factor = 1.f; |
| 381 gfx::Rect viewport_rect(0, 0, 100, 100); | 386 gfx::Rect device_viewport_rect(0, 0, 100, 100); |
| 382 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); | 387 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); |
| 383 | 388 |
| 384 RenderPassList list; | 389 RenderPassList list; |
| 385 | 390 |
| 386 SkBitmap output; | |
| 387 output.setConfig(SkBitmap::kARGB_8888_Config, | |
| 388 viewport_rect.width(), | |
| 389 viewport_rect.height()); | |
| 390 output.allocPixels(); | |
| 391 | |
| 392 // Pass drawn as inner quad is magenta. | 391 // Pass drawn as inner quad is magenta. |
| 393 gfx::Rect smaller_rect(20, 20, 60, 60); | 392 gfx::Rect smaller_rect(20, 20, 60, 60); |
| 394 RenderPass::Id smaller_pass_id(2, 1); | 393 RenderPass::Id smaller_pass_id(2, 1); |
| 395 TestRenderPass* smaller_pass = | 394 TestRenderPass* smaller_pass = |
| 396 AddRenderPass(&list, smaller_pass_id, smaller_rect, gfx::Transform()); | 395 AddRenderPass(&list, smaller_pass_id, smaller_rect, gfx::Transform()); |
| 397 AddQuad(smaller_pass, smaller_rect, SK_ColorMAGENTA); | 396 AddQuad(smaller_pass, smaller_rect, SK_ColorMAGENTA); |
| 398 | 397 |
| 399 // Root pass is green. | 398 // Root pass is green. |
| 400 RenderPass::Id root_clear_pass_id(1, 0); | 399 RenderPass::Id root_clear_pass_id(1, 0); |
| 401 TestRenderPass* root_clear_pass = | 400 TestRenderPass* root_clear_pass = AddRenderPass( |
| 402 AddRenderPass(&list, root_clear_pass_id, viewport_rect, gfx::Transform()); | 401 &list, root_clear_pass_id, device_viewport_rect, gfx::Transform()); |
| 403 AddRenderPassQuad(root_clear_pass, smaller_pass); | 402 AddRenderPassQuad(root_clear_pass, smaller_pass); |
| 404 AddQuad(root_clear_pass, viewport_rect, SK_ColorGREEN); | 403 AddQuad(root_clear_pass, device_viewport_rect, SK_ColorGREEN); |
| 405 | 404 |
| 406 // Interior pass quad has smaller visible rect. | 405 // Interior pass quad has smaller visible rect. |
| 407 gfx::Rect interior_visible_rect(30, 30, 40, 40); | 406 gfx::Rect interior_visible_rect(30, 30, 40, 40); |
| 408 root_clear_pass->quad_list[0]->visible_rect = interior_visible_rect; | 407 root_clear_pass->quad_list[0]->visible_rect = interior_visible_rect; |
| 409 | 408 |
| 410 renderer()->DecideRenderPassAllocationsForFrame(list); | 409 renderer()->DecideRenderPassAllocationsForFrame(list); |
| 411 renderer()->DrawFrame(&list, | |
| 412 device_scale_factor, | |
| 413 viewport_rect, | |
| 414 viewport_rect, | |
| 415 false); | |
| 416 renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect); | |
| 417 | 410 |
| 418 EXPECT_EQ(SK_ColorGREEN, output.getColor(0, 0)); | 411 scoped_ptr<SkBitmap> output = |
| 412 DrawAndCopyOutput(&list, device_scale_factor, device_viewport_rect); |
| 413 EXPECT_EQ(device_viewport_rect.width(), output->info().fWidth); |
| 414 EXPECT_EQ(device_viewport_rect.width(), output->info().fHeight); |
| 415 |
| 416 EXPECT_EQ(SK_ColorGREEN, output->getColor(0, 0)); |
| 417 EXPECT_EQ(SK_ColorGREEN, |
| 418 output->getColor(device_viewport_rect.width() - 1, |
| 419 device_viewport_rect.height() - 1)); |
| 420 |
| 421 // Part outside visible rect should remain green. |
| 422 EXPECT_EQ(SK_ColorGREEN, |
| 423 output->getColor(smaller_rect.x(), smaller_rect.y())); |
| 419 EXPECT_EQ( | 424 EXPECT_EQ( |
| 420 SK_ColorGREEN, | 425 SK_ColorGREEN, |
| 421 output.getColor(viewport_rect.width() - 1, viewport_rect.height() - 1)); | 426 output->getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); |
| 422 | |
| 423 // Part outside visible rect should remain green. | |
| 424 EXPECT_EQ(SK_ColorGREEN, output.getColor(smaller_rect.x(), smaller_rect.y())); | |
| 425 EXPECT_EQ( | |
| 426 SK_ColorGREEN, | |
| 427 output.getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); | |
| 428 | 427 |
| 429 EXPECT_EQ( | 428 EXPECT_EQ( |
| 430 SK_ColorMAGENTA, | 429 SK_ColorMAGENTA, |
| 431 output.getColor(interior_visible_rect.x(), interior_visible_rect.y())); | 430 output->getColor(interior_visible_rect.x(), interior_visible_rect.y())); |
| 432 EXPECT_EQ(SK_ColorMAGENTA, | 431 EXPECT_EQ(SK_ColorMAGENTA, |
| 433 output.getColor(interior_visible_rect.right() - 1, | 432 output->getColor(interior_visible_rect.right() - 1, |
| 434 interior_visible_rect.bottom() - 1)); | 433 interior_visible_rect.bottom() - 1)); |
| 435 } | 434 } |
| 436 | 435 |
| 437 } // namespace | 436 } // namespace |
| 438 } // namespace cc | 437 } // namespace cc |
| OLD | NEW |