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 "cc/layers/quad_sink.h" | 7 #include "cc/layers/quad_sink.h" |
8 #include "cc/output/compositor_frame_metadata.h" | 8 #include "cc/output/compositor_frame_metadata.h" |
9 #include "cc/output/software_output_device.h" | 9 #include "cc/output/software_output_device.h" |
10 #include "cc/quads/render_pass.h" | 10 #include "cc/quads/render_pass.h" |
11 #include "cc/quads/render_pass_draw_quad.h" | 11 #include "cc/quads/render_pass_draw_quad.h" |
12 #include "cc/quads/solid_color_draw_quad.h" | 12 #include "cc/quads/solid_color_draw_quad.h" |
13 #include "cc/quads/tile_draw_quad.h" | 13 #include "cc/quads/tile_draw_quad.h" |
14 #include "cc/test/animation_test_common.h" | 14 #include "cc/test/animation_test_common.h" |
15 #include "cc/test/fake_output_surface.h" | 15 #include "cc/test/fake_output_surface.h" |
16 #include "cc/test/fake_output_surface_client.h" | 16 #include "cc/test/fake_output_surface_client.h" |
17 #include "cc/test/geometry_test_utils.h" | 17 #include "cc/test/geometry_test_utils.h" |
18 #include "cc/test/render_pass_test_common.h" | 18 #include "cc/test/render_pass_test_common.h" |
19 #include "cc/test/render_pass_test_utils.h" | 19 #include "cc/test/render_pass_test_utils.h" |
20 #include "testing/gmock/include/gmock/gmock.h" | 20 #include "testing/gmock/include/gmock/gmock.h" |
21 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
22 #include "third_party/skia/include/core/SkCanvas.h" | 22 #include "third_party/skia/include/core/SkCanvas.h" |
23 #include "third_party/skia/include/core/SkDevice.h" | 23 #include "third_party/skia/include/core/SkDevice.h" |
24 | 24 |
25 namespace cc { | 25 namespace cc { |
26 namespace { | 26 namespace { |
27 | 27 |
28 class SoftwareRendererTest : public testing::Test, public RendererClient { | 28 class SoftwareRendererTest : public testing::Test, public RendererClient { |
29 public: | 29 public: |
30 SoftwareRendererTest() : should_clear_root_render_pass_(true) {} | |
31 | |
32 void InitializeRenderer( | 30 void InitializeRenderer( |
33 scoped_ptr<SoftwareOutputDevice> software_output_device) { | 31 scoped_ptr<SoftwareOutputDevice> software_output_device) { |
34 output_surface_ = FakeOutputSurface::CreateSoftware( | 32 output_surface_ = FakeOutputSurface::CreateSoftware( |
35 software_output_device.Pass()); | 33 software_output_device.Pass()); |
36 CHECK(output_surface_->BindToClient(&output_surface_client_)); | 34 CHECK(output_surface_->BindToClient(&output_surface_client_)); |
37 | 35 |
38 resource_provider_ = ResourceProvider::Create(output_surface_.get(), 0); | 36 resource_provider_ = ResourceProvider::Create(output_surface_.get(), 0); |
39 renderer_ = SoftwareRenderer::Create( | 37 renderer_ = SoftwareRenderer::Create( |
40 this, output_surface_.get(), resource_provider()); | 38 this, &settings_, output_surface_.get(), resource_provider()); |
41 } | 39 } |
42 | 40 |
43 ResourceProvider* resource_provider() const { | 41 ResourceProvider* resource_provider() const { |
44 return resource_provider_.get(); | 42 return resource_provider_.get(); |
45 } | 43 } |
46 | 44 |
47 SoftwareRenderer* renderer() const { return renderer_.get(); } | 45 SoftwareRenderer* renderer() const { return renderer_.get(); } |
48 | 46 |
49 void set_viewport(gfx::Rect viewport) { | 47 void set_viewport(gfx::Rect viewport) { |
50 viewport_ = viewport; | 48 viewport_ = viewport; |
51 } | 49 } |
52 | 50 |
53 void set_should_clear_root_render_pass(bool clear_root_render_pass) { | |
54 should_clear_root_render_pass_ = clear_root_render_pass; | |
55 } | |
56 | |
57 // RendererClient implementation. | 51 // RendererClient implementation. |
58 virtual gfx::Rect DeviceViewport() const OVERRIDE { | 52 virtual gfx::Rect DeviceViewport() const OVERRIDE { |
59 return viewport_; | 53 return viewport_; |
60 } | 54 } |
61 virtual gfx::Rect DeviceClip() const OVERRIDE { | 55 virtual gfx::Rect DeviceClip() const OVERRIDE { return DeviceViewport(); } |
62 return DeviceViewport(); | |
63 } | |
64 virtual float DeviceScaleFactor() const OVERRIDE { | |
65 return 1.f; | |
66 } | |
67 virtual const LayerTreeSettings& Settings() const OVERRIDE { | |
68 return settings_; | |
69 } | |
70 virtual void SetFullRootLayerDamage() OVERRIDE {} | 56 virtual void SetFullRootLayerDamage() OVERRIDE {} |
71 virtual bool HasImplThread() const OVERRIDE { return false; } | |
72 virtual bool ShouldClearRootRenderPass() const OVERRIDE { | |
73 return should_clear_root_render_pass_; | |
74 } | |
75 virtual CompositorFrameMetadata MakeCompositorFrameMetadata() const OVERRIDE { | 57 virtual CompositorFrameMetadata MakeCompositorFrameMetadata() const OVERRIDE { |
76 return CompositorFrameMetadata(); | 58 return CompositorFrameMetadata(); |
77 } | 59 } |
78 virtual bool AllowPartialSwap() const OVERRIDE { | |
79 return true; | |
80 } | |
81 virtual bool ExternalStencilTestEnabled() const OVERRIDE { return false; } | |
82 | 60 |
83 protected: | 61 protected: |
| 62 LayerTreeSettings settings_; |
84 FakeOutputSurfaceClient output_surface_client_; | 63 FakeOutputSurfaceClient output_surface_client_; |
85 scoped_ptr<FakeOutputSurface> output_surface_; | 64 scoped_ptr<FakeOutputSurface> output_surface_; |
86 scoped_ptr<ResourceProvider> resource_provider_; | 65 scoped_ptr<ResourceProvider> resource_provider_; |
87 scoped_ptr<SoftwareRenderer> renderer_; | 66 scoped_ptr<SoftwareRenderer> renderer_; |
88 gfx::Rect viewport_; | 67 gfx::Rect viewport_; |
89 LayerTreeSettings settings_; | |
90 bool should_clear_root_render_pass_; | |
91 }; | 68 }; |
92 | 69 |
93 TEST_F(SoftwareRendererTest, SolidColorQuad) { | 70 TEST_F(SoftwareRendererTest, SolidColorQuad) { |
94 gfx::Size outer_size(100, 100); | 71 gfx::Size outer_size(100, 100); |
95 gfx::Size inner_size(98, 98); | 72 gfx::Size inner_size(98, 98); |
96 gfx::Rect outer_rect(outer_size); | 73 gfx::Rect outer_rect(outer_size); |
97 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size); | 74 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size); |
98 gfx::Rect visible_rect(gfx::Point(1, 2), gfx::Size(98, 97)); | 75 gfx::Rect visible_rect(gfx::Point(1, 2), gfx::Size(98, 97)); |
99 set_viewport(gfx::Rect(outer_size)); | 76 set_viewport(gfx::Rect(outer_size)); |
100 | 77 |
(...skipping 10 matching lines...) Expand all Loading... |
111 outer_quad->SetNew( | 88 outer_quad->SetNew( |
112 shared_quad_state.get(), outer_rect, SK_ColorYELLOW, false); | 89 shared_quad_state.get(), outer_rect, SK_ColorYELLOW, false); |
113 scoped_ptr<SolidColorDrawQuad> inner_quad = SolidColorDrawQuad::Create(); | 90 scoped_ptr<SolidColorDrawQuad> inner_quad = SolidColorDrawQuad::Create(); |
114 inner_quad->SetNew(shared_quad_state.get(), inner_rect, SK_ColorCYAN, false); | 91 inner_quad->SetNew(shared_quad_state.get(), inner_rect, SK_ColorCYAN, false); |
115 inner_quad->visible_rect = visible_rect; | 92 inner_quad->visible_rect = visible_rect; |
116 root_render_pass->AppendQuad(inner_quad.PassAs<DrawQuad>()); | 93 root_render_pass->AppendQuad(inner_quad.PassAs<DrawQuad>()); |
117 root_render_pass->AppendQuad(outer_quad.PassAs<DrawQuad>()); | 94 root_render_pass->AppendQuad(outer_quad.PassAs<DrawQuad>()); |
118 | 95 |
119 RenderPassList list; | 96 RenderPassList list; |
120 list.push_back(root_render_pass.PassAs<RenderPass>()); | 97 list.push_back(root_render_pass.PassAs<RenderPass>()); |
121 renderer()->DrawFrame(&list, NULL); | 98 |
| 99 float device_scale_factor = 1.f; |
| 100 renderer()->DrawFrame(&list, NULL, device_scale_factor, true); |
122 | 101 |
123 SkBitmap output; | 102 SkBitmap output; |
124 output.setConfig(SkBitmap::kARGB_8888_Config, | 103 output.setConfig(SkBitmap::kARGB_8888_Config, |
125 DeviceViewport().width(), | 104 DeviceViewport().width(), |
126 DeviceViewport().height()); | 105 DeviceViewport().height()); |
127 output.allocPixels(); | 106 output.allocPixels(); |
128 renderer()->GetFramebufferPixels(output.getPixels(), outer_rect); | 107 renderer()->GetFramebufferPixels(output.getPixels(), outer_rect); |
129 | 108 |
130 EXPECT_EQ(SK_ColorYELLOW, output.getColor(0, 0)); | 109 EXPECT_EQ(SK_ColorYELLOW, output.getColor(0, 0)); |
131 EXPECT_EQ(SK_ColorYELLOW, | 110 EXPECT_EQ(SK_ColorYELLOW, |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 inner_rect, | 179 inner_rect, |
201 resource_cyan, | 180 resource_cyan, |
202 gfx::RectF(inner_size), | 181 gfx::RectF(inner_size), |
203 inner_size, | 182 inner_size, |
204 false); | 183 false); |
205 root_render_pass->AppendQuad(inner_quad.PassAs<DrawQuad>()); | 184 root_render_pass->AppendQuad(inner_quad.PassAs<DrawQuad>()); |
206 root_render_pass->AppendQuad(outer_quad.PassAs<DrawQuad>()); | 185 root_render_pass->AppendQuad(outer_quad.PassAs<DrawQuad>()); |
207 | 186 |
208 RenderPassList list; | 187 RenderPassList list; |
209 list.push_back(root_render_pass.PassAs<RenderPass>()); | 188 list.push_back(root_render_pass.PassAs<RenderPass>()); |
210 renderer()->DrawFrame(&list, NULL); | 189 |
| 190 float device_scale_factor = 1.f; |
| 191 renderer()->DrawFrame(&list, NULL, device_scale_factor, true); |
211 | 192 |
212 SkBitmap output; | 193 SkBitmap output; |
213 output.setConfig(SkBitmap::kARGB_8888_Config, | 194 output.setConfig(SkBitmap::kARGB_8888_Config, |
214 DeviceViewport().width(), | 195 DeviceViewport().width(), |
215 DeviceViewport().height()); | 196 DeviceViewport().height()); |
216 output.allocPixels(); | 197 output.allocPixels(); |
217 renderer()->GetFramebufferPixels(output.getPixels(), outer_rect); | 198 renderer()->GetFramebufferPixels(output.getPixels(), outer_rect); |
218 | 199 |
219 EXPECT_EQ(SK_ColorYELLOW, output.getColor(0, 0)); | 200 EXPECT_EQ(SK_ColorYELLOW, output.getColor(0, 0)); |
220 EXPECT_EQ(SK_ColorYELLOW, | 201 EXPECT_EQ(SK_ColorYELLOW, |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
268 tile_rect, | 249 tile_rect, |
269 resource_cyan, | 250 resource_cyan, |
270 gfx::RectF(tile_size), | 251 gfx::RectF(tile_size), |
271 tile_size, | 252 tile_size, |
272 false); | 253 false); |
273 quad->visible_rect = visible_rect; | 254 quad->visible_rect = visible_rect; |
274 root_render_pass->AppendQuad(quad.PassAs<DrawQuad>()); | 255 root_render_pass->AppendQuad(quad.PassAs<DrawQuad>()); |
275 | 256 |
276 RenderPassList list; | 257 RenderPassList list; |
277 list.push_back(root_render_pass.PassAs<RenderPass>()); | 258 list.push_back(root_render_pass.PassAs<RenderPass>()); |
278 renderer()->DrawFrame(&list, NULL); | 259 |
| 260 float device_scale_factor = 1.f; |
| 261 renderer()->DrawFrame(&list, NULL, device_scale_factor, true); |
279 | 262 |
280 SkBitmap output; | 263 SkBitmap output; |
281 output.setConfig(SkBitmap::kARGB_8888_Config, | 264 output.setConfig(SkBitmap::kARGB_8888_Config, |
282 DeviceViewport().width(), | 265 DeviceViewport().width(), |
283 DeviceViewport().height()); | 266 DeviceViewport().height()); |
284 output.allocPixels(); | 267 output.allocPixels(); |
285 renderer()->GetFramebufferPixels(output.getPixels(), tile_rect); | 268 renderer()->GetFramebufferPixels(output.getPixels(), tile_rect); |
286 | 269 |
287 // Check portion of tile not in visible rect isn't drawn. | 270 // Check portion of tile not in visible rect isn't drawn. |
288 const unsigned int kTransparent = SK_ColorTRANSPARENT; | 271 const unsigned int kTransparent = SK_ColorTRANSPARENT; |
289 EXPECT_EQ(kTransparent, output.getColor(0, 0)); | 272 EXPECT_EQ(kTransparent, output.getColor(0, 0)); |
290 EXPECT_EQ(kTransparent, | 273 EXPECT_EQ(kTransparent, |
291 output.getColor(tile_rect.width() - 1, tile_rect.height() - 1)); | 274 output.getColor(tile_rect.width() - 1, tile_rect.height() - 1)); |
292 EXPECT_EQ(kTransparent, | 275 EXPECT_EQ(kTransparent, |
293 output.getColor(visible_rect.x() - 1, visible_rect.y() - 1)); | 276 output.getColor(visible_rect.x() - 1, visible_rect.y() - 1)); |
294 EXPECT_EQ(kTransparent, | 277 EXPECT_EQ(kTransparent, |
295 output.getColor(visible_rect.right(), visible_rect.bottom())); | 278 output.getColor(visible_rect.right(), visible_rect.bottom())); |
296 // Ensure visible part is drawn correctly. | 279 // Ensure visible part is drawn correctly. |
297 EXPECT_EQ(SK_ColorCYAN, output.getColor(visible_rect.x(), visible_rect.y())); | 280 EXPECT_EQ(SK_ColorCYAN, output.getColor(visible_rect.x(), visible_rect.y())); |
298 EXPECT_EQ( | 281 EXPECT_EQ( |
299 SK_ColorCYAN, | 282 SK_ColorCYAN, |
300 output.getColor(visible_rect.right() - 2, visible_rect.bottom() - 2)); | 283 output.getColor(visible_rect.right() - 2, visible_rect.bottom() - 2)); |
301 // Ensure last visible line is correct. | 284 // Ensure last visible line is correct. |
302 EXPECT_EQ( | 285 EXPECT_EQ( |
303 SK_ColorYELLOW, | 286 SK_ColorYELLOW, |
304 output.getColor(visible_rect.right() - 1, visible_rect.bottom() - 1)); | 287 output.getColor(visible_rect.right() - 1, visible_rect.bottom() - 1)); |
305 } | 288 } |
306 | 289 |
307 TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) { | 290 TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) { |
| 291 float device_scale_factor = 1.f; |
308 gfx::Rect viewport_rect(0, 0, 100, 100); | 292 gfx::Rect viewport_rect(0, 0, 100, 100); |
309 set_viewport(viewport_rect); | 293 set_viewport(viewport_rect); |
310 set_should_clear_root_render_pass(false); | 294 |
| 295 settings_.should_clear_root_render_pass = false; |
311 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); | 296 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); |
312 | 297 |
313 RenderPassList list; | 298 RenderPassList list; |
314 | 299 |
315 SkBitmap output; | 300 SkBitmap output; |
316 output.setConfig(SkBitmap::kARGB_8888_Config, | 301 output.setConfig(SkBitmap::kARGB_8888_Config, |
317 viewport_rect.width(), | 302 viewport_rect.width(), |
318 viewport_rect.height()); | 303 viewport_rect.height()); |
319 output.allocPixels(); | 304 output.allocPixels(); |
320 | 305 |
321 // Draw a fullscreen green quad in a first frame. | 306 // Draw a fullscreen green quad in a first frame. |
322 RenderPass::Id root_clear_pass_id(1, 0); | 307 RenderPass::Id root_clear_pass_id(1, 0); |
323 TestRenderPass* root_clear_pass = AddRenderPass( | 308 TestRenderPass* root_clear_pass = AddRenderPass( |
324 &list, root_clear_pass_id, viewport_rect, gfx::Transform()); | 309 &list, root_clear_pass_id, viewport_rect, gfx::Transform()); |
325 AddQuad(root_clear_pass, viewport_rect, SK_ColorGREEN); | 310 AddQuad(root_clear_pass, viewport_rect, SK_ColorGREEN); |
326 | 311 |
327 renderer()->DecideRenderPassAllocationsForFrame(list); | 312 renderer()->DecideRenderPassAllocationsForFrame(list); |
328 renderer()->DrawFrame(&list, NULL); | 313 renderer()->DrawFrame(&list, NULL, device_scale_factor, true); |
329 renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect); | 314 renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect); |
330 | 315 |
331 EXPECT_EQ(SK_ColorGREEN, output.getColor(0, 0)); | 316 EXPECT_EQ(SK_ColorGREEN, output.getColor(0, 0)); |
332 EXPECT_EQ(SK_ColorGREEN, | 317 EXPECT_EQ(SK_ColorGREEN, |
333 output.getColor(viewport_rect.width() - 1, viewport_rect.height() - 1)); | 318 output.getColor(viewport_rect.width() - 1, viewport_rect.height() - 1)); |
334 | 319 |
335 list.clear(); | 320 list.clear(); |
336 | 321 |
337 // Draw a smaller magenta rect without filling the viewport in a separate | 322 // Draw a smaller magenta rect without filling the viewport in a separate |
338 // frame. | 323 // frame. |
339 gfx::Rect smaller_rect(20, 20, 60, 60); | 324 gfx::Rect smaller_rect(20, 20, 60, 60); |
340 | 325 |
341 RenderPass::Id root_smaller_pass_id(2, 0); | 326 RenderPass::Id root_smaller_pass_id(2, 0); |
342 TestRenderPass* root_smaller_pass = AddRenderPass( | 327 TestRenderPass* root_smaller_pass = AddRenderPass( |
343 &list, root_smaller_pass_id, viewport_rect, gfx::Transform()); | 328 &list, root_smaller_pass_id, viewport_rect, gfx::Transform()); |
344 AddQuad(root_smaller_pass, smaller_rect, SK_ColorMAGENTA); | 329 AddQuad(root_smaller_pass, smaller_rect, SK_ColorMAGENTA); |
345 | 330 |
346 renderer()->DecideRenderPassAllocationsForFrame(list); | 331 renderer()->DecideRenderPassAllocationsForFrame(list); |
347 renderer()->DrawFrame(&list, NULL); | 332 renderer()->DrawFrame(&list, NULL, device_scale_factor, true); |
348 renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect); | 333 renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect); |
349 | 334 |
350 // If we didn't clear, the borders should still be green. | 335 // If we didn't clear, the borders should still be green. |
351 EXPECT_EQ(SK_ColorGREEN, output.getColor(0, 0)); | 336 EXPECT_EQ(SK_ColorGREEN, output.getColor(0, 0)); |
352 EXPECT_EQ(SK_ColorGREEN, | 337 EXPECT_EQ(SK_ColorGREEN, |
353 output.getColor(viewport_rect.width() - 1, viewport_rect.height() - 1)); | 338 output.getColor(viewport_rect.width() - 1, viewport_rect.height() - 1)); |
354 | 339 |
355 EXPECT_EQ(SK_ColorMAGENTA, | 340 EXPECT_EQ(SK_ColorMAGENTA, |
356 output.getColor(smaller_rect.x(), smaller_rect.y())); | 341 output.getColor(smaller_rect.x(), smaller_rect.y())); |
357 EXPECT_EQ(SK_ColorMAGENTA, | 342 EXPECT_EQ(SK_ColorMAGENTA, |
358 output.getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); | 343 output.getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); |
359 } | 344 } |
360 | 345 |
361 TEST_F(SoftwareRendererTest, RenderPassVisibleRect) { | 346 TEST_F(SoftwareRendererTest, RenderPassVisibleRect) { |
| 347 float device_scale_factor = 1.f; |
362 gfx::Rect viewport_rect(0, 0, 100, 100); | 348 gfx::Rect viewport_rect(0, 0, 100, 100); |
363 set_viewport(viewport_rect); | 349 set_viewport(viewport_rect); |
364 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); | 350 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); |
365 | 351 |
366 RenderPassList list; | 352 RenderPassList list; |
367 | 353 |
368 SkBitmap output; | 354 SkBitmap output; |
369 output.setConfig(SkBitmap::kARGB_8888_Config, | 355 output.setConfig(SkBitmap::kARGB_8888_Config, |
370 viewport_rect.width(), | 356 viewport_rect.width(), |
371 viewport_rect.height()); | 357 viewport_rect.height()); |
(...skipping 11 matching lines...) Expand all Loading... |
383 TestRenderPass* root_clear_pass = | 369 TestRenderPass* root_clear_pass = |
384 AddRenderPass(&list, root_clear_pass_id, viewport_rect, gfx::Transform()); | 370 AddRenderPass(&list, root_clear_pass_id, viewport_rect, gfx::Transform()); |
385 AddRenderPassQuad(root_clear_pass, smaller_pass); | 371 AddRenderPassQuad(root_clear_pass, smaller_pass); |
386 AddQuad(root_clear_pass, viewport_rect, SK_ColorGREEN); | 372 AddQuad(root_clear_pass, viewport_rect, SK_ColorGREEN); |
387 | 373 |
388 // Interior pass quad has smaller visible rect. | 374 // Interior pass quad has smaller visible rect. |
389 gfx::Rect interior_visible_rect(30, 30, 40, 40); | 375 gfx::Rect interior_visible_rect(30, 30, 40, 40); |
390 root_clear_pass->quad_list[0]->visible_rect = interior_visible_rect; | 376 root_clear_pass->quad_list[0]->visible_rect = interior_visible_rect; |
391 | 377 |
392 renderer()->DecideRenderPassAllocationsForFrame(list); | 378 renderer()->DecideRenderPassAllocationsForFrame(list); |
393 renderer()->DrawFrame(&list, NULL); | 379 renderer()->DrawFrame(&list, NULL, device_scale_factor, true); |
394 renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect); | 380 renderer()->GetFramebufferPixels(output.getPixels(), viewport_rect); |
395 | 381 |
396 EXPECT_EQ(SK_ColorGREEN, output.getColor(0, 0)); | 382 EXPECT_EQ(SK_ColorGREEN, output.getColor(0, 0)); |
397 EXPECT_EQ( | 383 EXPECT_EQ( |
398 SK_ColorGREEN, | 384 SK_ColorGREEN, |
399 output.getColor(viewport_rect.width() - 1, viewport_rect.height() - 1)); | 385 output.getColor(viewport_rect.width() - 1, viewport_rect.height() - 1)); |
400 | 386 |
401 // Part outside visible rect should remain green. | 387 // Part outside visible rect should remain green. |
402 EXPECT_EQ(SK_ColorGREEN, output.getColor(smaller_rect.x(), smaller_rect.y())); | 388 EXPECT_EQ(SK_ColorGREEN, output.getColor(smaller_rect.x(), smaller_rect.y())); |
403 EXPECT_EQ( | 389 EXPECT_EQ( |
404 SK_ColorGREEN, | 390 SK_ColorGREEN, |
405 output.getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); | 391 output.getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); |
406 | 392 |
407 EXPECT_EQ( | 393 EXPECT_EQ( |
408 SK_ColorMAGENTA, | 394 SK_ColorMAGENTA, |
409 output.getColor(interior_visible_rect.x(), interior_visible_rect.y())); | 395 output.getColor(interior_visible_rect.x(), interior_visible_rect.y())); |
410 EXPECT_EQ(SK_ColorMAGENTA, | 396 EXPECT_EQ(SK_ColorMAGENTA, |
411 output.getColor(interior_visible_rect.right() - 1, | 397 output.getColor(interior_visible_rect.right() - 1, |
412 interior_visible_rect.bottom() - 1)); | 398 interior_visible_rect.bottom() - 1)); |
413 } | 399 } |
414 | 400 |
415 } // namespace | 401 } // namespace |
416 } // namespace cc | 402 } // namespace cc |
OLD | NEW |