Chromium Code Reviews| Index: cc/output/software_renderer.cc |
| diff --git a/cc/output/software_renderer.cc b/cc/output/software_renderer.cc |
| index 1b18648e115cb92efc48350704422c280b15e8ee..eeca4997ab894b007edfc88f486d4de5e60c7210 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" |
| @@ -230,7 +231,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); |
| @@ -265,9 +272,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(thildebr) For now since checkerboards shouldn't be part of a 3D |
|
enne (OOO)
2015/02/04 21:24:00
Maybe assign this TODO to somebody else. Me?
awoloszyn
2015/02/12 16:48:52
Done.
|
| + // 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)); |
| @@ -302,6 +331,9 @@ void SoftwareRenderer::DoDrawQuad(DrawingFrame* frame, const DrawQuad* quad) { |
| } |
| current_canvas_->resetMatrix(); |
| + if (draw_region) { |
| + current_canvas_->restore(); |
| + } |
| } |
| void SoftwareRenderer::DrawCheckerboardQuad(const DrawingFrame* frame, |