Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3846)

Unified Diff: cc/playback/display_item_list.cc

Issue 2075873002: Support general raster matrix for RasterSource and DisplayItemList (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix a bug in PrepareForPlaybackToCanvas and fix cc_unittests Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: cc/playback/display_item_list.cc
diff --git a/cc/playback/display_item_list.cc b/cc/playback/display_item_list.cc
index 3ad738ab7dbd0b554e659ac0ff21f2ed9583040a..511e5bbf149e3ee7d5b75145e7691a997938abe7 100644
--- a/cc/playback/display_item_list.cc
+++ b/cc/playback/display_item_list.cc
@@ -119,17 +119,31 @@ void DisplayItemList::Raster(SkCanvas* canvas,
SkPicture::AbortCallback* callback,
const gfx::Rect& canvas_target_playback_rect,
float contents_scale) const {
+ canvas->save();
+
+ if (!canvas_target_playback_rect.IsEmpty()) {
+ // canvas_target_playback_rect is specified in device space. We can't
+ // use clipRect because canvas CTM will be applied on it. Use clipRegion
+ // instead because it ignores canvas CTM.
+ SkRegion device_clip;
+ device_clip.setRect(gfx::RectToSkIRect(canvas_target_playback_rect));
+ canvas->clipRegion(device_clip);
+ }
+
+ canvas->scale(contents_scale, contents_scale);
+ Raster(canvas, callback);
+ canvas->restore();
+}
+
+void DisplayItemList::Raster(SkCanvas* canvas,
+ SkPicture::AbortCallback* callback) const {
if (!settings_.use_cached_picture) {
- canvas->save();
- canvas->scale(contents_scale, contents_scale);
for (const auto& item : items_)
- item.Raster(canvas, canvas_target_playback_rect, callback);
- canvas->restore();
+ item.Raster(canvas, callback);
} else {
DCHECK(picture_);
canvas->save();
- canvas->scale(contents_scale, contents_scale);
canvas->translate(layer_rect_.x(), layer_rect_.y());
if (callback) {
// If we have a callback, we need to call |draw()|, |drawPicture()|
@@ -148,7 +162,7 @@ void DisplayItemList::Raster(SkCanvas* canvas,
void DisplayItemList::ProcessAppendedItem(const DisplayItem* item) {
if (settings_.use_cached_picture) {
DCHECK(recorder_);
- item->Raster(recorder_->getRecordingCanvas(), gfx::Rect(), nullptr);
+ item->Raster(recorder_->getRecordingCanvas(), nullptr);
}
if (!retain_individual_display_items_) {
items_.Clear();
@@ -159,7 +173,7 @@ void DisplayItemList::RasterIntoCanvas(const DisplayItem& item) {
DCHECK(recorder_);
DCHECK(!retain_individual_display_items_);
- item.Raster(recorder_->getRecordingCanvas(), gfx::Rect(), nullptr);
+ item.Raster(recorder_->getRecordingCanvas(), nullptr);
}
bool DisplayItemList::RetainsIndividualDisplayItems() const {

Powered by Google App Engine
This is Rietveld 408576698