diff options
Diffstat (limited to 'cc')
-rw-r--r-- | cc/output/renderer_pixeltest.cc | 73 | ||||
-rw-r--r-- | cc/output/software_renderer.cc | 34 |
2 files changed, 86 insertions, 21 deletions
diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc index d85db7f..e8d1323 100644 --- a/cc/output/renderer_pixeltest.cc +++ b/cc/output/renderer_pixeltest.cc @@ -1416,6 +1416,79 @@ TYPED_TEST(RendererPixelTestWithSkiaGPUBackend, PictureDrawQuadIdentityScale) { ExactPixelComparator(true))); } +// Not WithSkiaGPUBackend since that path currently requires tiles for opacity. +TYPED_TEST(RendererPixelTest, PictureDrawQuadOpacity) { + gfx::Size pile_tile_size(1000, 1000); + gfx::Rect viewport(this->device_viewport_size_); + bool use_skia_gpu_backend = this->UseSkiaGPUBackend(); + bool contents_swizzled = !PlatformColor::SameComponentOrder(GL_RGBA); + + RenderPass::Id id(1, 1); + gfx::Transform transform_to_root; + scoped_ptr<RenderPass> pass = + CreateTestRenderPass(id, viewport, transform_to_root); + + // One viewport-filling 0.5-opacity green quad. + scoped_refptr<FakePicturePileImpl> green_pile = + FakePicturePileImpl::CreateFilledPile(pile_tile_size, viewport.size()); + SkPaint green_paint; + green_paint.setColor(SK_ColorGREEN); + green_pile->add_draw_rect_with_paint(viewport, green_paint); + green_pile->RerecordPile(); + + gfx::Transform green_content_to_target_transform; + scoped_ptr<SharedQuadState> green_shared_state = + CreateTestSharedQuadState(green_content_to_target_transform, viewport); + green_shared_state->opacity = 0.5f; + + scoped_ptr<PictureDrawQuad> green_quad = PictureDrawQuad::Create(); + green_quad->SetNew(green_shared_state.get(), + viewport, + gfx::Rect(), + gfx::RectF(0, 0, 1, 1), + viewport.size(), + contents_swizzled, + viewport, + 1.f, + use_skia_gpu_backend, + green_pile); + pass->quad_list.push_back(green_quad.PassAs<DrawQuad>()); + + // One viewport-filling white quad. + scoped_refptr<FakePicturePileImpl> white_pile = + FakePicturePileImpl::CreateFilledPile(pile_tile_size, viewport.size()); + SkPaint white_paint; + white_paint.setColor(SK_ColorWHITE); + white_pile->add_draw_rect_with_paint(viewport, white_paint); + white_pile->RerecordPile(); + + gfx::Transform white_content_to_target_transform; + scoped_ptr<SharedQuadState> white_shared_state = + CreateTestSharedQuadState(white_content_to_target_transform, viewport); + + scoped_ptr<PictureDrawQuad> white_quad = PictureDrawQuad::Create(); + white_quad->SetNew(white_shared_state.get(), + viewport, + gfx::Rect(), + gfx::RectF(0, 0, 1, 1), + viewport.size(), + contents_swizzled, + viewport, + 1.f, + use_skia_gpu_backend, + white_pile); + pass->quad_list.push_back(white_quad.PassAs<DrawQuad>()); + + RenderPassList pass_list; + pass_list.push_back(pass.Pass()); + + EXPECT_TRUE(this->RunPixelTest( + &pass_list, + PixelTest::NoOffscreenContext, + base::FilePath(FILE_PATH_LITERAL("green_alpha.png")), + FuzzyPixelOffByOneComparator(true))); +} + TYPED_TEST(RendererPixelTestWithSkiaGPUBackend, PictureDrawQuadNonIdentityScale) { gfx::Size pile_tile_size(1000, 1000); diff --git a/cc/output/software_renderer.cc b/cc/output/software_renderer.cc index 7054fd5..77c44ea 100644 --- a/cc/output/software_renderer.cc +++ b/cc/output/software_renderer.cc @@ -19,7 +19,7 @@ #include "cc/quads/solid_color_draw_quad.h" #include "cc/quads/texture_draw_quad.h" #include "cc/quads/tile_draw_quad.h" -#include "third_party/skia/include/core/SkBitmapDevice.h" +#include "skia/ext/opacity_draw_filter.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkColor.h" #include "third_party/skia/include/core/SkMatrix.h" @@ -313,27 +313,19 @@ void SoftwareRenderer::DrawPictureQuad(const DrawingFrame* frame, SkMatrix::kFill_ScaleToFit); current_canvas_->concat(content_matrix); - if (quad->ShouldDrawWithBlending()) { - TRACE_EVENT0("cc", "SoftwareRenderer::DrawPictureQuad with blending"); - SkBitmap temp_bitmap; - temp_bitmap.setConfig(SkBitmap::kARGB_8888_Config, - quad->texture_size.width(), - quad->texture_size.height()); - temp_bitmap.allocPixels(); - SkBitmapDevice temp_device(temp_bitmap); - SkCanvas temp_canvas(&temp_device); - - quad->picture_pile->RasterToBitmap( - &temp_canvas, quad->content_rect, quad->contents_scale, NULL); + // TODO(aelias): This isn't correct in all cases. We should detect these + // cases and fall back to a persistent bitmap backing + // (http://crbug.com/280374). + DCHECK(!current_canvas_->getDrawFilter()); + current_canvas_->setDrawFilter(new skia::OpacityDrawFilter(quad->opacity(), + true)); - current_paint_.setFilterBitmap(true); - current_canvas_->drawBitmap(temp_bitmap, 0, 0, ¤t_paint_); - } else { - TRACE_EVENT0("cc", - "SoftwareRenderer::DrawPictureQuad direct from PicturePile"); - quad->picture_pile->RasterDirect( - current_canvas_, quad->content_rect, quad->contents_scale, NULL); - } + TRACE_EVENT0("cc", + "SoftwareRenderer::DrawPictureQuad"); + quad->picture_pile->RasterDirect( + current_canvas_, quad->content_rect, quad->contents_scale, NULL); + + current_canvas_->setDrawFilter(NULL); } void SoftwareRenderer::DrawSolidColorQuad(const DrawingFrame* frame, |