Index: cc/resources/content_layer_updater.cc |
diff --git a/cc/resources/content_layer_updater.cc b/cc/resources/content_layer_updater.cc |
index c9c2eccf31c2bb257db05b020a0b3209d6d80b2b..50ea86bd35c68d868bde8c59de677c49184aafad 100644 |
--- a/cc/resources/content_layer_updater.cc |
+++ b/cc/resources/content_layer_updater.cc |
@@ -9,6 +9,7 @@ |
#include "cc/debug/rendering_stats_instrumentation.h" |
#include "cc/resources/layer_painter.h" |
#include "third_party/skia/include/core/SkCanvas.h" |
+#include "third_party/skia/include/core/SkDevice.h" |
#include "third_party/skia/include/core/SkPaint.h" |
#include "third_party/skia/include/core/SkRect.h" |
#include "third_party/skia/include/core/SkScalar.h" |
@@ -23,7 +24,8 @@ ContentLayerUpdater::ContentLayerUpdater( |
int layer_id) |
: rendering_stats_instrumentation_(stats_instrumentation), |
layer_id_(layer_id), |
- painter_(painter.Pass()) {} |
+ painter_(painter.Pass()), |
+ layer_is_opaque_(false) {} |
ContentLayerUpdater::~ContentLayerUpdater() {} |
@@ -33,14 +35,17 @@ void ContentLayerUpdater::set_rendering_stats_instrumentation( |
} |
void ContentLayerUpdater::PaintContents(SkCanvas* canvas, |
- gfx::Rect content_rect, |
+ gfx::Point origin, |
float contents_width_scale, |
float contents_height_scale, |
gfx::Rect* resulting_opaque_rect) { |
TRACE_EVENT0("cc", "ContentLayerUpdater::PaintContents"); |
canvas->save(); |
- canvas->translate(SkFloatToScalar(-content_rect.x()), |
- SkFloatToScalar(-content_rect.y())); |
+ canvas->translate(SkFloatToScalar(-origin.x()), |
+ SkFloatToScalar(-origin.y())); |
+ |
+ SkDevice* device = canvas->getDevice(); |
+ gfx::Rect content_rect(origin, gfx::Size(device->width(), device->height())); |
gfx::Rect layer_rect = content_rect; |
@@ -52,12 +57,14 @@ void ContentLayerUpdater::PaintContents(SkCanvas* canvas, |
content_rect, 1.f / contents_width_scale, 1.f / contents_height_scale); |
} |
- SkPaint paint; |
- paint.setAntiAlias(false); |
- paint.setXfermodeMode(SkXfermode::kClear_Mode); |
SkRect layer_sk_rect = SkRect::MakeXYWH( |
layer_rect.x(), layer_rect.y(), layer_rect.width(), layer_rect.height()); |
- canvas->drawRect(layer_sk_rect, paint); |
+ |
+ // If the layer has opaque contents then there is no need to |
+ // clear the canvas before painting. |
+ if (!layer_is_opaque_) |
+ canvas->clear(SK_ColorTRANSPARENT); |
+ |
canvas->clipRect(layer_sk_rect); |
gfx::RectF opaque_layer_rect; |
@@ -71,4 +78,8 @@ void ContentLayerUpdater::PaintContents(SkCanvas* canvas, |
content_rect_ = content_rect; |
} |
+void ContentLayerUpdater::SetOpaque(bool opaque) { |
+ layer_is_opaque_ = opaque; |
+} |
+ |
} // namespace cc |