summaryrefslogtreecommitdiffstats
path: root/cc/output/software_renderer.cc
diff options
context:
space:
mode:
authorawoloszyn <awoloszyn@chromium.org>2015-02-27 12:31:30 -0800
committerCommit bot <commit-bot@chromium.org>2015-02-27 20:32:37 +0000
commitac754705ceaa5bc4cb8dc8df9a733b4b68396399 (patch)
treea59317979092a071f8ffafb59919ffbda09f5145 /cc/output/software_renderer.cc
parent1a015c984eedb167733f84dd9623a3d02f467784 (diff)
downloadchromium_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.cc36
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,