summaryrefslogtreecommitdiffstats
path: root/cc
diff options
context:
space:
mode:
Diffstat (limited to 'cc')
-rw-r--r--cc/output/renderer_pixeltest.cc73
-rw-r--r--cc/output/software_renderer.cc34
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, &current_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,