Index: cc/output/software_renderer.cc |
diff --git a/cc/output/software_renderer.cc b/cc/output/software_renderer.cc |
index bb8010847ef60fe50b26629dd0f52dc6f1d7c20e..34eda97f5d477b5b878000184fd1a0346eaa9fb2 100644 |
--- a/cc/output/software_renderer.cc |
+++ b/cc/output/software_renderer.cc |
@@ -99,19 +99,10 @@ bool SoftwareRenderer::FlippedFramebuffer() const { |
void SoftwareRenderer::EnsureScissorTestEnabled() { |
is_scissor_enabled_ = true; |
- SetClipRect(scissor_rect_); |
} |
void SoftwareRenderer::EnsureScissorTestDisabled() { |
- // There is no explicit notion of enabling/disabling scissoring in software |
- // rendering, but the underlying effect we want is to clear any existing |
- // clipRect on the current SkCanvas. This is done by setting clipRect to |
- // the viewport's dimensions. |
- if (!current_canvas_) |
- return; |
is_scissor_enabled_ = false; |
- SkISize size = current_canvas_->getBaseLayerSize(); |
- SetClipRect(gfx::Rect(size.width(), size.height())); |
} |
void SoftwareRenderer::BindFramebufferToOutputSurface() { |
@@ -140,7 +131,6 @@ bool SoftwareRenderer::BindFramebufferToTexture( |
void SoftwareRenderer::SetScissorTestRect(const gfx::Rect& scissor_rect) { |
is_scissor_enabled_ = true; |
scissor_rect_ = scissor_rect; |
- SetClipRect(scissor_rect); |
} |
void SoftwareRenderer::SetClipRect(const gfx::Rect& rect) { |
@@ -149,9 +139,13 @@ void SoftwareRenderer::SetClipRect(const gfx::Rect& rect) { |
// Skia applies the current matrix to clip rects so we reset it temporary. |
SkMatrix current_matrix = current_canvas_->getTotalMatrix(); |
current_canvas_->resetMatrix(); |
- // TODO(fmalita) stop using kReplace (see crbug.com/673851) |
- current_canvas_->clipRect(gfx::RectToSkRect(rect), |
- SkClipOp::kReplace_deprecated); |
+ // SetClipRect is assumed to be applied temporarily, on an |
+ // otherwise-unclipped canvas. |
+ DCHECK_EQ(current_canvas_->getDeviceClipBounds().width(), |
+ current_canvas_->imageInfo().width()); |
+ DCHECK_EQ(current_canvas_->getDeviceClipBounds().height(), |
+ current_canvas_->imageInfo().height()); |
+ current_canvas_->clipRect(gfx::RectToSkRect(rect)); |
current_canvas_->setMatrix(current_matrix); |
} |
@@ -208,11 +202,14 @@ void SoftwareRenderer::DoDrawQuad(const DrawQuad* quad, |
const gfx::QuadF* draw_region) { |
if (!current_canvas_) |
return; |
- if (draw_region) { |
- current_canvas_->save(); |
- } |
TRACE_EVENT0("cc", "SoftwareRenderer::DoDrawQuad"); |
+ bool do_save = draw_region || is_scissor_enabled_; |
+ SkAutoCanvasRestore canvas_restore(current_canvas_, do_save); |
+ if (is_scissor_enabled_) { |
+ SetClipRect(scissor_rect_); |
+ } |
+ |
gfx::Transform quad_rect_matrix; |
QuadRectTransform(&quad_rect_matrix, |
quad->shared_quad_state->quad_to_target_transform, |
@@ -298,9 +295,6 @@ void SoftwareRenderer::DoDrawQuad(const DrawQuad* quad, |
} |
current_canvas_->resetMatrix(); |
- if (draw_region) { |
- current_canvas_->restore(); |
- } |
} |
void SoftwareRenderer::DrawDebugBorderQuad(const DebugBorderDrawQuad* quad) { |