| 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 {
 | 
| 
 |