Index: cc/picture.cc |
diff --git a/cc/picture.cc b/cc/picture.cc |
index 3fac26e5839a1c53b4ffbf1af8b456aad95c7632..f7e0a4ea0a97621b4fd1a93fe88efc5806b9a465 100644 |
--- a/cc/picture.cc |
+++ b/cc/picture.cc |
@@ -4,14 +4,80 @@ |
#include "config.h" |
+#include "base/debug/trace_event.h" |
+#include "cc/content_layer_client.h" |
#include "cc/picture.h" |
+#include "cc/rendering_stats.h" |
+#include "third_party/skia/include/core/SkCanvas.h" |
+#include "ui/gfx/rect_conversions.h" |
namespace cc { |
-Picture::Picture() { |
+scoped_refptr<Picture> Picture::Create() { |
+ return make_scoped_refptr(new Picture()); |
+} |
+ |
+Picture::Picture() : picture_(new SkPicture()) { |
+} |
+ |
+Picture::Picture(SkPicture* picture, gfx::Rect layer_rect, |
+ gfx::Rect opaque_rect) : |
+ layer_rect_(layer_rect), |
+ opaque_rect_(opaque_rect), |
+ picture_(picture) { |
} |
Picture::~Picture() { |
} |
+scoped_refptr<Picture> Picture::Clone() { |
+ // SkPicture is not thread-safe to rasterize with, so return a thread-safe |
+ // clone of it. |
+ SkPicture* clone = picture_->clone(); |
+ return make_scoped_refptr(new Picture(clone, layer_rect_, opaque_rect_)); |
+} |
+ |
+void Picture::Record(ContentLayerClient* painter, gfx::Rect layer_rect, |
+ RenderingStats& stats) { |
+ TRACE_EVENT0("cc", "Picture::Record"); |
+ SkCanvas* canvas = picture_->beginRecording( |
+ layer_rect.width(), |
+ layer_rect.height(), |
+ SkPicture::kOptimizeForClippedPlayback_RecordingFlag); |
+ |
+ canvas->save(); |
+ canvas->translate(SkFloatToScalar(-layer_rect.x()), |
+ SkFloatToScalar(-layer_rect.y())); |
+ |
+ SkPaint paint; |
+ paint.setAntiAlias(false); |
+ paint.setXfermodeMode(SkXfermode::kClear_Mode); |
+ SkRect layer_skrect = SkRect::MakeXYWH(layer_rect.x(), |
+ layer_rect.y(), |
+ layer_rect.width(), |
+ layer_rect.height()); |
+ canvas->drawRect(layer_skrect, paint); |
+ canvas->clipRect(layer_skrect); |
+ |
+ gfx::RectF opaque_layer_rect; |
+ base::TimeTicks beginPaintTime = base::TimeTicks::Now(); |
+ painter->paintContents(canvas, layer_rect, opaque_layer_rect); |
+ double delta = (base::TimeTicks::Now() - beginPaintTime).InSecondsF(); |
+ stats.totalPaintTimeInSeconds += delta; |
+ |
+ canvas->restore(); |
+ picture_->endRecording(); |
+ |
+ opaque_rect_ = gfx::ToEnclosedRect(opaque_layer_rect); |
+ layer_rect_ = layer_rect; |
+} |
+ |
+void Picture::Raster(SkCanvas* canvas) { |
+ TRACE_EVENT0("cc", "Picture::Raster"); |
+ canvas->translate(layer_rect_.x(), layer_rect_.y()); |
+ canvas->save(); |
slavi
2012/11/09 23:56:21
No need to save/resore here. See comment of SkCanv
enne (OOO)
2012/11/09 23:59:20
Oh, thanks! :)
|
+ canvas->drawPicture(*picture_); |
+ canvas->restore(); |
+} |
+ |
} // namespace cc |