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/trace_event/trace_event.h" | 9 #include "base/trace_event/trace_event.h" |
10 #include "cc/base/math_util.h" | 10 #include "cc/base/math_util.h" |
11 #include "cc/base/region.h" | 11 #include "cc/base/region.h" |
12 #include "cc/debug/debug_colors.h" | 12 #include "cc/debug/debug_colors.h" |
| 13 #include "cc/paint/paint_recorder.h" |
13 #include "cc/playback/display_item_list.h" | 14 #include "cc/playback/display_item_list.h" |
14 #include "cc/playback/image_hijack_canvas.h" | 15 #include "cc/playback/image_hijack_canvas.h" |
15 #include "cc/playback/skip_image_canvas.h" | 16 #include "cc/playback/skip_image_canvas.h" |
16 #include "skia/ext/analysis_canvas.h" | 17 #include "skia/ext/analysis_canvas.h" |
17 #include "third_party/skia/include/core/SkCanvas.h" | |
18 #include "third_party/skia/include/core/SkClipStack.h" | |
19 #include "third_party/skia/include/core/SkPictureRecorder.h" | |
20 #include "ui/gfx/geometry/rect_conversions.h" | 18 #include "ui/gfx/geometry/rect_conversions.h" |
21 | 19 |
22 namespace cc { | 20 namespace cc { |
23 | 21 |
24 scoped_refptr<RasterSource> RasterSource::CreateFromRecordingSource( | 22 scoped_refptr<RasterSource> RasterSource::CreateFromRecordingSource( |
25 const RecordingSource* other, | 23 const RecordingSource* other, |
26 bool can_use_lcd_text) { | 24 bool can_use_lcd_text) { |
27 return make_scoped_refptr(new RasterSource(other, can_use_lcd_text)); | 25 return make_scoped_refptr(new RasterSource(other, can_use_lcd_text)); |
28 } | 26 } |
29 | 27 |
(...skipping 23 matching lines...) Expand all Loading... |
53 recorded_viewport_(other->recorded_viewport_), | 51 recorded_viewport_(other->recorded_viewport_), |
54 size_(other->size_), | 52 size_(other->size_), |
55 clear_canvas_with_debug_color_(other->clear_canvas_with_debug_color_), | 53 clear_canvas_with_debug_color_(other->clear_canvas_with_debug_color_), |
56 slow_down_raster_scale_factor_for_debug_( | 54 slow_down_raster_scale_factor_for_debug_( |
57 other->slow_down_raster_scale_factor_for_debug_), | 55 other->slow_down_raster_scale_factor_for_debug_), |
58 image_decode_cache_(other->image_decode_cache_) {} | 56 image_decode_cache_(other->image_decode_cache_) {} |
59 | 57 |
60 RasterSource::~RasterSource() { | 58 RasterSource::~RasterSource() { |
61 } | 59 } |
62 | 60 |
63 void RasterSource::PlaybackToCanvas(SkCanvas* raster_canvas, | 61 void RasterSource::PlaybackToCanvas(PaintCanvas* raster_canvas, |
64 const gfx::Rect& canvas_bitmap_rect, | 62 const gfx::Rect& canvas_bitmap_rect, |
65 const gfx::Rect& canvas_playback_rect, | 63 const gfx::Rect& canvas_playback_rect, |
66 float raster_scale, | 64 float raster_scale, |
67 const PlaybackSettings& settings) const { | 65 const PlaybackSettings& settings) const { |
68 SkIRect raster_bounds = gfx::RectToSkIRect(canvas_bitmap_rect); | 66 SkIRect raster_bounds = gfx::RectToSkIRect(canvas_bitmap_rect); |
69 if (!canvas_playback_rect.IsEmpty() && | 67 if (!canvas_playback_rect.IsEmpty() && |
70 !raster_bounds.intersect(gfx::RectToSkIRect(canvas_playback_rect))) | 68 !raster_bounds.intersect(gfx::RectToSkIRect(canvas_playback_rect))) |
71 return; | 69 return; |
72 // Treat all subnormal values as zero for performance. | 70 // Treat all subnormal values as zero for performance. |
73 ScopedSubnormalFloatDisabler disabler; | 71 ScopedSubnormalFloatDisabler disabler; |
74 | 72 |
75 raster_canvas->save(); | 73 raster_canvas->save(); |
76 raster_canvas->translate(-canvas_bitmap_rect.x(), -canvas_bitmap_rect.y()); | 74 raster_canvas->translate(-canvas_bitmap_rect.x(), -canvas_bitmap_rect.y()); |
77 raster_canvas->clipRect(SkRect::MakeFromIRect(raster_bounds)); | 75 raster_canvas->clipRect(SkRect::MakeFromIRect(raster_bounds)); |
78 raster_canvas->scale(raster_scale, raster_scale); | 76 raster_canvas->scale(raster_scale, raster_scale); |
79 PlaybackToCanvas(raster_canvas, settings); | 77 PlaybackToCanvas(raster_canvas, settings); |
80 raster_canvas->restore(); | 78 raster_canvas->restore(); |
81 } | 79 } |
82 | 80 |
83 void RasterSource::PlaybackToCanvas(SkCanvas* raster_canvas, | 81 void RasterSource::PlaybackToCanvas(PaintCanvas* raster_canvas, |
84 const PlaybackSettings& settings) const { | 82 const PlaybackSettings& settings) const { |
85 if (!settings.playback_to_shared_canvas) | 83 if (!settings.playback_to_shared_canvas) |
86 PrepareForPlaybackToCanvas(raster_canvas); | 84 PrepareForPlaybackToCanvas(raster_canvas); |
87 | 85 |
88 if (settings.skip_images) { | 86 if (settings.skip_images) { |
89 SkipImageCanvas canvas(raster_canvas); | 87 SkipImageCanvas canvas(raster_canvas); |
90 RasterCommon(&canvas, nullptr); | 88 RasterCommon(&canvas, nullptr); |
91 } else if (settings.use_image_hijack_canvas) { | 89 } else if (settings.use_image_hijack_canvas) { |
92 const SkImageInfo& info = raster_canvas->imageInfo(); | 90 const SkImageInfo& info = raster_canvas->imageInfo(); |
93 | 91 |
94 ImageHijackCanvas canvas(info.width(), info.height(), image_decode_cache_); | 92 ImageHijackCanvas canvas(info.width(), info.height(), image_decode_cache_); |
95 // Before adding the canvas, make sure that the ImageHijackCanvas is aware | 93 // Before adding the canvas, make sure that the ImageHijackCanvas is aware |
96 // of the current transform and clip, which may affect the clip bounds. | 94 // of the current transform and clip, which may affect the clip bounds. |
97 // Since we query the clip bounds of the current canvas to get the list of | 95 // Since we query the clip bounds of the current canvas to get the list of |
98 // draw commands to process, this is important to produce correct content. | 96 // draw commands to process, this is important to produce correct content. |
99 SkIRect raster_bounds; | 97 SkIRect raster_bounds; |
100 raster_canvas->getClipDeviceBounds(&raster_bounds); | 98 raster_canvas->getClipDeviceBounds(&raster_bounds); |
101 canvas.clipRect(SkRect::MakeFromIRect(raster_bounds)); | 99 canvas.clipRect(SkRect::MakeFromIRect(raster_bounds)); |
102 canvas.setMatrix(raster_canvas->getTotalMatrix()); | 100 canvas.setMatrix(raster_canvas->getTotalMatrix()); |
103 canvas.addCanvas(raster_canvas); | 101 canvas.addCanvas(raster_canvas); |
104 | 102 |
105 RasterCommon(&canvas, nullptr); | 103 RasterCommon(&canvas, nullptr); |
106 } else { | 104 } else { |
107 RasterCommon(raster_canvas, nullptr); | 105 RasterCommon(raster_canvas, nullptr); |
108 } | 106 } |
109 } | 107 } |
110 | 108 |
111 namespace { | 109 namespace { |
112 | 110 |
113 bool CanvasIsUnclipped(const SkCanvas* canvas) { | 111 bool CanvasIsUnclipped(const PaintCanvas* canvas) { |
114 if (!canvas->isClipRect()) | 112 if (!canvas->isClipRect()) |
115 return false; | 113 return false; |
116 | 114 |
117 SkIRect bounds; | 115 SkIRect bounds; |
118 if (!canvas->getClipDeviceBounds(&bounds)) | 116 if (!canvas->getClipDeviceBounds(&bounds)) |
119 return false; | 117 return false; |
120 | 118 |
121 SkISize size = canvas->getBaseLayerSize(); | 119 SkISize size = canvas->getBaseLayerSize(); |
122 return bounds.contains(0, 0, size.width(), size.height()); | 120 return bounds.contains(0, 0, size.width(), size.height()); |
123 } | 121 } |
124 | 122 |
125 } // namespace | 123 } // namespace |
126 | 124 |
127 void RasterSource::PrepareForPlaybackToCanvas(SkCanvas* canvas) const { | 125 void RasterSource::PrepareForPlaybackToCanvas(PaintCanvas* canvas) const { |
128 // TODO(hendrikw): See if we can split this up into separate functions. | 126 // TODO(hendrikw): See if we can split this up into separate functions. |
129 | 127 |
130 if (CanvasIsUnclipped(canvas)) | 128 if (CanvasIsUnclipped(canvas)) |
131 canvas->discard(); | 129 canvas->discard(); |
132 | 130 |
133 // If this raster source has opaque contents, it is guaranteeing that it will | 131 // If this raster source has opaque contents, it is guaranteeing that it will |
134 // draw an opaque rect the size of the layer. If it is not, then we must | 132 // draw an opaque rect the size of the layer. If it is not, then we must |
135 // clear this canvas ourselves. | 133 // clear this canvas ourselves. |
136 if (requires_clear_) { | 134 if (requires_clear_) { |
137 canvas->clear(SK_ColorTRANSPARENT); | 135 canvas->clear(SK_ColorTRANSPARENT); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
193 canvas->save(); | 191 canvas->save(); |
194 // Use clipRegion to bypass CTM because the rects are device rects. | 192 // Use clipRegion to bypass CTM because the rects are device rects. |
195 SkRegion interest_region; | 193 SkRegion interest_region; |
196 interest_region.setRect(interest_rect); | 194 interest_region.setRect(interest_rect); |
197 interest_region.op(opaque_rect, SkRegion::kDifference_Op); | 195 interest_region.op(opaque_rect, SkRegion::kDifference_Op); |
198 canvas->clipRegion(interest_region); | 196 canvas->clipRegion(interest_region); |
199 canvas->clear(background_color_); | 197 canvas->clear(background_color_); |
200 canvas->restore(); | 198 canvas->restore(); |
201 } | 199 } |
202 | 200 |
203 void RasterSource::RasterCommon(SkCanvas* canvas, | 201 void RasterSource::RasterCommon(PaintCanvas* canvas, |
204 SkPicture::AbortCallback* callback) const { | 202 PaintRecord::AbortCallback* callback) const { |
205 DCHECK(display_list_.get()); | 203 DCHECK(display_list_.get()); |
206 int repeat_count = std::max(1, slow_down_raster_scale_factor_for_debug_); | 204 int repeat_count = std::max(1, slow_down_raster_scale_factor_for_debug_); |
207 for (int i = 0; i < repeat_count; ++i) | 205 for (int i = 0; i < repeat_count; ++i) |
208 display_list_->Raster(canvas, callback); | 206 display_list_->Raster(canvas, callback); |
209 } | 207 } |
210 | 208 |
211 sk_sp<SkPicture> RasterSource::GetFlattenedPicture() { | 209 sk_sp<PaintRecord> RasterSource::GetFlattenedPicture() { |
212 TRACE_EVENT0("cc", "RasterSource::GetFlattenedPicture"); | 210 TRACE_EVENT0("cc", "RasterSource::GetFlattenedPicture"); |
213 | 211 |
214 SkPictureRecorder recorder; | 212 PaintRecorder recorder; |
215 SkCanvas* canvas = recorder.beginRecording(size_.width(), size_.height()); | 213 PaintCanvas* canvas = recorder.beginRecording(size_.width(), size_.height()); |
216 if (!size_.IsEmpty()) { | 214 if (!size_.IsEmpty()) { |
217 PrepareForPlaybackToCanvas(canvas); | 215 PrepareForPlaybackToCanvas(canvas); |
218 RasterCommon(canvas, nullptr); | 216 RasterCommon(canvas, nullptr); |
219 } | 217 } |
220 | 218 |
221 return recorder.finishRecordingAsPicture(); | 219 return recorder.finishRecordingAsPicture(); |
222 } | 220 } |
223 | 221 |
224 size_t RasterSource::GetPictureMemoryUsage() const { | 222 size_t RasterSource::GetPictureMemoryUsage() const { |
225 if (!display_list_) | 223 if (!display_list_) |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
306 bool can_use_lcd_text = false; | 304 bool can_use_lcd_text = false; |
307 return scoped_refptr<RasterSource>(new RasterSource(this, can_use_lcd_text)); | 305 return scoped_refptr<RasterSource>(new RasterSource(this, can_use_lcd_text)); |
308 } | 306 } |
309 | 307 |
310 RasterSource::PlaybackSettings::PlaybackSettings() | 308 RasterSource::PlaybackSettings::PlaybackSettings() |
311 : playback_to_shared_canvas(false), | 309 : playback_to_shared_canvas(false), |
312 skip_images(false), | 310 skip_images(false), |
313 use_image_hijack_canvas(true) {} | 311 use_image_hijack_canvas(true) {} |
314 | 312 |
315 } // namespace cc | 313 } // namespace cc |
OLD | NEW |