diff options
author | awoloszyn <awoloszyn@chromium.org> | 2015-02-27 12:31:30 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-02-27 20:32:37 +0000 |
commit | ac754705ceaa5bc4cb8dc8df9a733b4b68396399 (patch) | |
tree | a59317979092a071f8ffafb59919ffbda09f5145 /cc/output/software_renderer.cc | |
parent | 1a015c984eedb167733f84dd9623a3d02f467784 (diff) | |
download | chromium_src-ac754705ceaa5bc4cb8dc8df9a733b4b68396399.zip chromium_src-ac754705ceaa5bc4cb8dc8df9a733b4b68396399.tar.gz chromium_src-ac754705ceaa5bc4cb8dc8df9a733b4b68396399.tar.bz2 |
Splitting of layers for correct intersections
Sorting 3d-sorted layers and rendering them in that order causes issues
when layers intersect. Instead place 3d-sorted layers in a bsp tree and
fragment any intersecting layers into non-rectangular quads. We can then
render the fragments in the correct sorted order regardless of
intersections.
BUG=455918,159225,132122,230833
Review URL: https://codereview.chromium.org/595593002
Cr-Commit-Position: refs/heads/master@{#318506}
Diffstat (limited to 'cc/output/software_renderer.cc')
-rw-r--r-- | cc/output/software_renderer.cc | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/cc/output/software_renderer.cc b/cc/output/software_renderer.cc index 5360d59..5726fd7 100644 --- a/cc/output/software_renderer.cc +++ b/cc/output/software_renderer.cc @@ -25,6 +25,7 @@ #include "third_party/skia/include/core/SkColor.h" #include "third_party/skia/include/core/SkImageFilter.h" #include "third_party/skia/include/core/SkMatrix.h" +#include "third_party/skia/include/core/SkPoint.h" #include "third_party/skia/include/core/SkShader.h" #include "third_party/skia/include/effects/SkLayerRasterizer.h" #include "ui/gfx/geometry/rect_conversions.h" @@ -235,7 +236,13 @@ bool SoftwareRenderer::IsSoftwareResource( return false; } -void SoftwareRenderer::DoDrawQuad(DrawingFrame* frame, const DrawQuad* quad) { +void SoftwareRenderer::DoDrawQuad(DrawingFrame* frame, + const DrawQuad* quad, + const gfx::QuadF* draw_region) { + if (draw_region) { + current_canvas_->save(); + } + TRACE_EVENT0("cc", "SoftwareRenderer::DoDrawQuad"); gfx::Transform quad_rect_matrix; QuadRectTransform(&quad_rect_matrix, quad->quadTransform(), quad->rect); @@ -270,9 +277,31 @@ void SoftwareRenderer::DoDrawQuad(DrawingFrame* frame, const DrawQuad* quad) { current_paint_.setXfermodeMode(SkXfermode::kSrc_Mode); } + if (draw_region) { + gfx::QuadF local_draw_region(*draw_region); + SkPath draw_region_clip_path; + local_draw_region -= + gfx::Vector2dF(quad->visible_rect.x(), quad->visible_rect.y()); + local_draw_region.Scale(1.0f / quad->visible_rect.width(), + 1.0f / quad->visible_rect.height()); + local_draw_region -= gfx::Vector2dF(0.5f, 0.5f); + + SkPoint clip_points[4]; + QuadFToSkPoints(local_draw_region, clip_points); + draw_region_clip_path.addPoly(clip_points, 4, true); + + current_canvas_->clipPath(draw_region_clip_path, SkRegion::kIntersect_Op, + false); + } + switch (quad->material) { case DrawQuad::CHECKERBOARD: - DrawCheckerboardQuad(frame, CheckerboardDrawQuad::MaterialCast(quad)); + // TODO(enne) For now since checkerboards shouldn't be part of a 3D + // context, clipping regions aren't supported so we skip drawing them + // if this becomes the case. + if (!draw_region) { + DrawCheckerboardQuad(frame, CheckerboardDrawQuad::MaterialCast(quad)); + } break; case DrawQuad::DEBUG_BORDER: DrawDebugBorderQuad(frame, DebugBorderDrawQuad::MaterialCast(quad)); @@ -307,6 +336,9 @@ void SoftwareRenderer::DoDrawQuad(DrawingFrame* frame, const DrawQuad* quad) { } current_canvas_->resetMatrix(); + if (draw_region) { + current_canvas_->restore(); + } } void SoftwareRenderer::DrawCheckerboardQuad(const DrawingFrame* frame, |