Index: cc/output/renderer_pixeltest.cc |
diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc |
index 278b30a1aad7f02db5cd69111a7c43169014ac51..a98ab8416afcf1b15241357b4f46c8ad70c061be 100644 |
--- a/cc/output/renderer_pixeltest.cc |
+++ b/cc/output/renderer_pixeltest.cc |
@@ -84,12 +84,12 @@ scoped_ptr<DrawQuad> CreateTestRenderPassDrawQuad( |
quad->SetNew(shared_state, |
rect, |
pass_id, |
- false, // is_replica |
- 0, // mask_resource_id |
- rect, // contents_changed_since_last_frame |
- gfx::RectF(), // mask_uv_rect |
- FilterOperations(), // foreground filters |
- FilterOperations()); // background filters |
+ false, // is_replica |
+ 0, // mask_resource_id |
+ rect, // contents_changed_since_last_frame |
+ gfx::RectF(1.f, 1.f), // mask_uv_rect |
+ FilterOperations(), // foreground filters |
+ FilterOperations()); // background filters |
return quad.PassAs<DrawQuad>(); |
} |
@@ -882,6 +882,107 @@ TYPED_TEST(RendererPixelTest, EnlargedRenderPassTextureWithAntiAliasing) { |
FuzzyPixelOffByOneComparator(true))); |
} |
+// This tests the case where we have a RenderPass with a mask, but the quad |
+// for the masked surface does not include the full surface texture. |
+TYPED_TEST(RendererPixelTest, RenderPassAndMaskWithPartialQuad) { |
+ gfx::Rect viewport_rect(this->device_viewport_size_); |
+ |
+ RenderPass::Id root_pass_id(1, 1); |
+ scoped_ptr<RenderPass> root_pass = |
+ CreateTestRootRenderPass(root_pass_id, viewport_rect); |
+ scoped_ptr<SharedQuadState> root_pass_shared_state = |
+ CreateTestSharedQuadState(gfx::Transform(), viewport_rect); |
+ |
+ RenderPass::Id child_pass_id(2, 2); |
+ gfx::Transform transform_to_root; |
+ scoped_ptr<RenderPass> child_pass = |
+ CreateTestRenderPass(child_pass_id, viewport_rect, transform_to_root); |
+ scoped_ptr<SharedQuadState> child_pass_shared_state = |
+ CreateTestSharedQuadState(gfx::Transform(), viewport_rect); |
+ |
+ // The child render pass is just a green box. |
+ static const SkColor kCSSGreen = 0xff008000; |
+ scoped_ptr<SolidColorDrawQuad> green = SolidColorDrawQuad::Create(); |
+ green->SetNew(child_pass_shared_state.get(), viewport_rect, kCSSGreen, false); |
+ child_pass->quad_list.push_back(green.PassAs<DrawQuad>()); |
+ |
+ // Make a mask. |
+ gfx::Rect mask_rect = viewport_rect; |
+ SkBitmap bitmap; |
+ bitmap.setConfig( |
+ SkBitmap::kARGB_8888_Config, mask_rect.width(), mask_rect.height()); |
+ bitmap.allocPixels(); |
+ SkBitmapDevice bitmap_device(bitmap); |
+ skia::RefPtr<SkCanvas> canvas = skia::AdoptRef(new SkCanvas(&bitmap_device)); |
+ SkPaint paint; |
+ paint.setStyle(SkPaint::kStroke_Style); |
+ paint.setStrokeWidth(SkIntToScalar(4)); |
+ paint.setColor(SK_ColorWHITE); |
+ canvas->clear(SK_ColorTRANSPARENT); |
+ gfx::Rect rect = mask_rect; |
+ while (!rect.IsEmpty()) { |
+ rect.Inset(6, 6, 4, 4); |
+ canvas->drawRect( |
+ SkRect::MakeXYWH(rect.x(), rect.y(), rect.width(), rect.height()), |
+ paint); |
+ rect.Inset(6, 6, 4, 4); |
+ } |
+ |
+ ResourceProvider::ResourceId mask_resource_id = |
+ this->resource_provider_->CreateResource( |
+ mask_rect.size(), |
+ GL_CLAMP_TO_EDGE, |
+ ResourceProvider::TextureUsageAny, |
+ RGBA_8888); |
+ { |
+ SkAutoLockPixels lock(bitmap); |
+ this->resource_provider_->SetPixels( |
+ mask_resource_id, |
+ reinterpret_cast<uint8_t*>(bitmap.getPixels()), |
+ mask_rect, |
+ mask_rect, |
+ gfx::Vector2d()); |
+ } |
+ |
+ // This RenderPassDrawQuad does not include the full |viewport_rect| which is |
+ // the size of the child render pass. |
+ gfx::Rect sub_rect = gfx::Rect(50, 50, 100, 100); |
+ EXPECT_NE(sub_rect.x(), child_pass->output_rect.x()); |
+ EXPECT_NE(sub_rect.y(), child_pass->output_rect.y()); |
+ EXPECT_NE(sub_rect.right(), child_pass->output_rect.right()); |
+ EXPECT_NE(sub_rect.bottom(), child_pass->output_rect.bottom()); |
+ EXPECT_TRUE(child_pass->output_rect.Contains(sub_rect)); |
+ |
+ // Set up a mask on the RenderPassDrawQuad. |
+ scoped_ptr<RenderPassDrawQuad> mask_quad = RenderPassDrawQuad::Create(); |
+ mask_quad->SetNew(root_pass_shared_state.get(), |
+ sub_rect, |
+ child_pass_id, |
+ false, // is_replica |
+ mask_resource_id, |
+ sub_rect, // contents_changed_since_last_frame |
+ gfx::RectF(1.f, 1.f), // mask_uv_rect |
+ FilterOperations(), // foreground filters |
+ FilterOperations()); // background filters |
+ root_pass->quad_list.push_back(mask_quad.PassAs<DrawQuad>()); |
+ |
+ // White background behind the masked render pass. |
+ scoped_ptr<SolidColorDrawQuad> white = SolidColorDrawQuad::Create(); |
+ white->SetNew( |
+ root_pass_shared_state.get(), viewport_rect, SK_ColorWHITE, false); |
+ root_pass->quad_list.push_back(white.PassAs<DrawQuad>()); |
+ |
+ RenderPassList pass_list; |
+ pass_list.push_back(child_pass.Pass()); |
+ pass_list.push_back(root_pass.Pass()); |
+ |
+ EXPECT_TRUE(this->RunPixelTest( |
+ &pass_list, |
+ PixelTest::NoOffscreenContext, |
+ base::FilePath(FILE_PATH_LITERAL("image_mask_of_layer.png")), |
+ ExactPixelComparator(true))); |
+} |
+ |
template <typename RendererType> |
class RendererPixelTestWithBackgroundFilter |
: public RendererPixelTest<RendererType> { |