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 |