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 |