| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/playback/raster_source.h" | 5 #include "cc/playback/raster_source.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
| 10 #include "base/thread_task_runner_handle.h" | 10 #include "base/thread_task_runner_handle.h" |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 79 } | 79 } |
| 80 | 80 |
| 81 RasterSource::~RasterSource() { | 81 RasterSource::~RasterSource() { |
| 82 // For MemoryDumpProvider deregistration to work correctly, this must happen | 82 // For MemoryDumpProvider deregistration to work correctly, this must happen |
| 83 // on the same thread that the RasterSource was created on. | 83 // on the same thread that the RasterSource was created on. |
| 84 DCHECK(memory_dump_thread_checker_.CalledOnValidThread()); | 84 DCHECK(memory_dump_thread_checker_.CalledOnValidThread()); |
| 85 base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( | 85 base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( |
| 86 this); | 86 this); |
| 87 } | 87 } |
| 88 | 88 |
| 89 void RasterSource::PlaybackToSharedCanvas(SkCanvas* raster_canvas, | |
| 90 const gfx::Rect& canvas_rect, | |
| 91 float contents_scale, | |
| 92 bool include_images) const { | |
| 93 // TODO(vmpstr): This can be improved by plumbing whether the tile itself has | |
| 94 // discardable images. This way we would only pay for the hijack canvas if the | |
| 95 // tile actually needed it. | |
| 96 if (!include_images) { | |
| 97 SkipImageCanvas canvas(raster_canvas); | |
| 98 RasterCommon(&canvas, nullptr, canvas_rect, canvas_rect, contents_scale); | |
| 99 } else if (display_list_->MayHaveDiscardableImages()) { | |
| 100 const SkImageInfo& info = raster_canvas->imageInfo(); | |
| 101 ImageHijackCanvas canvas(info.width(), info.height(), | |
| 102 image_decode_controller_); | |
| 103 canvas.addCanvas(raster_canvas); | |
| 104 | |
| 105 RasterCommon(&canvas, nullptr, canvas_rect, canvas_rect, contents_scale); | |
| 106 } else { | |
| 107 RasterCommon(raster_canvas, nullptr, canvas_rect, canvas_rect, | |
| 108 contents_scale); | |
| 109 } | |
| 110 } | |
| 111 | |
| 112 void RasterSource::RasterForAnalysis(skia::AnalysisCanvas* canvas, | |
| 113 const gfx::Rect& canvas_rect, | |
| 114 float contents_scale) const { | |
| 115 RasterCommon(canvas, canvas, canvas_rect, canvas_rect, contents_scale); | |
| 116 } | |
| 117 | |
| 118 void RasterSource::PlaybackToCanvas(SkCanvas* raster_canvas, | 89 void RasterSource::PlaybackToCanvas(SkCanvas* raster_canvas, |
| 119 const gfx::Rect& canvas_bitmap_rect, | 90 const gfx::Rect& canvas_bitmap_rect, |
| 120 const gfx::Rect& canvas_playback_rect, | 91 const gfx::Rect& canvas_playback_rect, |
| 121 float contents_scale, | 92 float contents_scale, |
| 122 bool include_images) const { | 93 const PlaybackSettings& settings) const { |
| 123 PrepareForPlaybackToCanvas(raster_canvas, canvas_bitmap_rect, | 94 if (!settings.playback_to_shared_canvas) { |
| 124 canvas_playback_rect, contents_scale); | 95 PrepareForPlaybackToCanvas(raster_canvas, canvas_bitmap_rect, |
| 96 canvas_playback_rect, contents_scale); |
| 97 } |
| 125 | 98 |
| 126 if (!include_images) { | 99 if (settings.skip_images) { |
| 127 SkipImageCanvas canvas(raster_canvas); | 100 SkipImageCanvas canvas(raster_canvas); |
| 128 RasterCommon(&canvas, nullptr, canvas_bitmap_rect, canvas_playback_rect, | 101 RasterCommon(&canvas, nullptr, canvas_bitmap_rect, canvas_playback_rect, |
| 129 contents_scale); | 102 contents_scale); |
| 130 } else if (display_list_->MayHaveDiscardableImages()) { | 103 } else if (settings.use_image_hijack_canvas && |
| 104 display_list_->MayHaveDiscardableImages()) { |
| 131 const SkImageInfo& info = raster_canvas->imageInfo(); | 105 const SkImageInfo& info = raster_canvas->imageInfo(); |
| 132 ImageHijackCanvas canvas(info.width(), info.height(), | 106 ImageHijackCanvas canvas(info.width(), info.height(), |
| 133 image_decode_controller_); | 107 image_decode_controller_); |
| 134 canvas.addCanvas(raster_canvas); | 108 canvas.addCanvas(raster_canvas); |
| 109 |
| 135 RasterCommon(&canvas, nullptr, canvas_bitmap_rect, canvas_playback_rect, | 110 RasterCommon(&canvas, nullptr, canvas_bitmap_rect, canvas_playback_rect, |
| 136 contents_scale); | 111 contents_scale); |
| 137 } else { | 112 } else { |
| 138 RasterCommon(raster_canvas, nullptr, canvas_bitmap_rect, | 113 RasterCommon(raster_canvas, nullptr, canvas_bitmap_rect, |
| 139 canvas_playback_rect, contents_scale); | 114 canvas_playback_rect, contents_scale); |
| 140 } | 115 } |
| 141 } | 116 } |
| 142 | 117 |
| 143 void RasterSource::PrepareForPlaybackToCanvas( | 118 void RasterSource::PrepareForPlaybackToCanvas( |
| 144 SkCanvas* canvas, | 119 SkCanvas* canvas, |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 275 bool RasterSource::PerformSolidColorAnalysis(const gfx::Rect& content_rect, | 250 bool RasterSource::PerformSolidColorAnalysis(const gfx::Rect& content_rect, |
| 276 float contents_scale, | 251 float contents_scale, |
| 277 SkColor* color) const { | 252 SkColor* color) const { |
| 278 TRACE_EVENT0("cc", "RasterSource::PerformSolidColorAnalysis"); | 253 TRACE_EVENT0("cc", "RasterSource::PerformSolidColorAnalysis"); |
| 279 | 254 |
| 280 gfx::Rect layer_rect = | 255 gfx::Rect layer_rect = |
| 281 gfx::ScaleToEnclosingRect(content_rect, 1.0f / contents_scale); | 256 gfx::ScaleToEnclosingRect(content_rect, 1.0f / contents_scale); |
| 282 | 257 |
| 283 layer_rect.Intersect(gfx::Rect(size_)); | 258 layer_rect.Intersect(gfx::Rect(size_)); |
| 284 skia::AnalysisCanvas canvas(layer_rect.width(), layer_rect.height()); | 259 skia::AnalysisCanvas canvas(layer_rect.width(), layer_rect.height()); |
| 285 RasterForAnalysis(&canvas, layer_rect, 1.0f); | 260 RasterCommon(&canvas, &canvas, layer_rect, layer_rect, 1.0f); |
| 286 return canvas.GetColorIfSolid(color); | 261 return canvas.GetColorIfSolid(color); |
| 287 } | 262 } |
| 288 | 263 |
| 289 void RasterSource::GetDiscardableImagesInRect( | 264 void RasterSource::GetDiscardableImagesInRect( |
| 290 const gfx::Rect& layer_rect, | 265 const gfx::Rect& layer_rect, |
| 291 float raster_scale, | 266 float raster_scale, |
| 292 std::vector<DrawImage>* images) const { | 267 std::vector<DrawImage>* images) const { |
| 293 DCHECK_EQ(0u, images->size()); | 268 DCHECK_EQ(0u, images->size()); |
| 294 display_list_->GetDiscardableImagesInRect(layer_rect, raster_scale, images); | 269 display_list_->GetDiscardableImagesInRect(layer_rect, raster_scale, images); |
| 295 } | 270 } |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 base::StringPrintf("cc/display_lists/raster_source_%p", this); | 341 base::StringPrintf("cc/display_lists/raster_source_%p", this); |
| 367 base::trace_event::MemoryAllocatorDump* dump = | 342 base::trace_event::MemoryAllocatorDump* dump = |
| 368 pmd->CreateAllocatorDump(dump_name); | 343 pmd->CreateAllocatorDump(dump_name); |
| 369 dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize, | 344 dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize, |
| 370 base::trace_event::MemoryAllocatorDump::kUnitsBytes, | 345 base::trace_event::MemoryAllocatorDump::kUnitsBytes, |
| 371 memory_usage); | 346 memory_usage); |
| 372 } | 347 } |
| 373 return true; | 348 return true; |
| 374 } | 349 } |
| 375 | 350 |
| 351 RasterSource::PlaybackSettings::PlaybackSettings() |
| 352 : playback_to_shared_canvas(false), |
| 353 skip_images(false), |
| 354 use_image_hijack_canvas(true) {} |
| 355 |
| 376 } // namespace cc | 356 } // namespace cc |
| OLD | NEW |