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

Side by Side Diff: cc/blink/web_display_item_list_impl.cc

Issue 1484163002: Raster display item lists via a visual rect RTree. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Expand by 10x. Created 4 years, 4 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 unified diff | Download patch
OLDNEW
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/blink/web_display_item_list_impl.h" 5 #include "cc/blink/web_display_item_list_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <vector> 10 #include <vector>
(...skipping 14 matching lines...) Expand all
25 #include "ui/gfx/geometry/safe_integer_conversions.h" 25 #include "ui/gfx/geometry/safe_integer_conversions.h"
26 #include "ui/gfx/transform.h" 26 #include "ui/gfx/transform.h"
27 27
28 namespace cc_blink { 28 namespace cc_blink {
29 29
30 namespace { 30 namespace {
31 31
32 scoped_refptr<cc::DisplayItemList> CreateUncachedDisplayItemListForBlink() { 32 scoped_refptr<cc::DisplayItemList> CreateUncachedDisplayItemListForBlink() {
33 cc::DisplayItemListSettings settings; 33 cc::DisplayItemListSettings settings;
34 settings.use_cached_picture = false; 34 settings.use_cached_picture = false;
35 gfx::Rect layer_rect; 35 return cc::DisplayItemList::Create(settings);
36 return cc::DisplayItemList::Create(layer_rect, settings);
37 } 36 }
38 37
39 } // namespace 38 } // namespace
40 39
41 WebDisplayItemListImpl::WebDisplayItemListImpl() 40 WebDisplayItemListImpl::WebDisplayItemListImpl()
42 : display_item_list_(CreateUncachedDisplayItemListForBlink()) { 41 : display_item_list_(CreateUncachedDisplayItemListForBlink()) {
43 } 42 }
44 43
45 WebDisplayItemListImpl::WebDisplayItemListImpl( 44 WebDisplayItemListImpl::WebDisplayItemListImpl(
46 cc::DisplayItemList* display_list) 45 cc::DisplayItemList* display_list)
47 : display_item_list_(display_list) { 46 : display_item_list_(display_list) {
48 } 47 }
49 48
50 void WebDisplayItemListImpl::appendDrawingItem( 49 void WebDisplayItemListImpl::appendDrawingItem(
51 const blink::WebRect& visual_rect, 50 const blink::WebRect& visual_rect,
52 sk_sp<const SkPicture> picture) { 51 sk_sp<const SkPicture> picture) {
53 if (display_item_list_->RetainsIndividualDisplayItems()) { 52 display_item_list_->CreateAndAppendItem<cc::DrawingDisplayItem>(
54 display_item_list_->CreateAndAppendItem<cc::DrawingDisplayItem>( 53 visual_rect, std::move(picture));
55 visual_rect, std::move(picture));
56 } else {
57 cc::DrawingDisplayItem item(std::move(picture));
58 display_item_list_->RasterIntoCanvas(item);
59 }
60 } 54 }
61 55
62 void WebDisplayItemListImpl::appendClipItem( 56 void WebDisplayItemListImpl::appendClipItem(
63 const blink::WebRect& visual_rect, 57 const blink::WebRect& visual_rect,
64 const blink::WebRect& clip_rect, 58 const blink::WebRect& clip_rect,
65 const blink::WebVector<SkRRect>& rounded_clip_rects) { 59 const blink::WebVector<SkRRect>& rounded_clip_rects) {
66 std::vector<SkRRect> rounded_rects; 60 std::vector<SkRRect> rounded_rects;
67 for (size_t i = 0; i < rounded_clip_rects.size(); ++i) { 61 for (size_t i = 0; i < rounded_clip_rects.size(); ++i) {
68 rounded_rects.push_back(rounded_clip_rects[i]); 62 rounded_rects.push_back(rounded_clip_rects[i]);
69 } 63 }
70 bool antialias = true; 64 bool antialias = true;
71 if (display_item_list_->RetainsIndividualDisplayItems()) { 65 display_item_list_->CreateAndAppendItem<cc::ClipDisplayItem>(
72 display_item_list_->CreateAndAppendItem<cc::ClipDisplayItem>( 66 visual_rect, clip_rect, rounded_rects, antialias);
73 visual_rect, clip_rect, rounded_rects, antialias);
74 } else {
75 cc::ClipDisplayItem item(clip_rect, rounded_rects, antialias);
76 display_item_list_->RasterIntoCanvas(item);
77 }
78 } 67 }
79 68
80 void WebDisplayItemListImpl::appendEndClipItem( 69 void WebDisplayItemListImpl::appendEndClipItem(
81 const blink::WebRect& visual_rect) { 70 const blink::WebRect& visual_rect) {
82 if (display_item_list_->RetainsIndividualDisplayItems()) { 71 display_item_list_->CreateAndAppendItem<cc::EndClipDisplayItem>(visual_rect);
83 display_item_list_->CreateAndAppendItem<cc::EndClipDisplayItem>(
84 visual_rect);
85 } else {
86 display_item_list_->RasterIntoCanvas(cc::EndClipDisplayItem());
87 }
88 } 72 }
89 73
90 void WebDisplayItemListImpl::appendClipPathItem( 74 void WebDisplayItemListImpl::appendClipPathItem(
91 const blink::WebRect& visual_rect, 75 const blink::WebRect& visual_rect,
92 const SkPath& clip_path, 76 const SkPath& clip_path,
93 SkRegion::Op clip_op, 77 SkRegion::Op clip_op,
94 bool antialias) { 78 bool antialias) {
95 if (display_item_list_->RetainsIndividualDisplayItems()) { 79 display_item_list_->CreateAndAppendItem<cc::ClipPathDisplayItem>(
96 display_item_list_->CreateAndAppendItem<cc::ClipPathDisplayItem>( 80 visual_rect, clip_path, clip_op, antialias);
97 visual_rect, clip_path, clip_op, antialias);
98 } else {
99 cc::ClipPathDisplayItem item(clip_path, clip_op, antialias);
100 display_item_list_->RasterIntoCanvas(item);
101 }
102 } 81 }
103 82
104 void WebDisplayItemListImpl::appendEndClipPathItem( 83 void WebDisplayItemListImpl::appendEndClipPathItem(
105 const blink::WebRect& visual_rect) { 84 const blink::WebRect& visual_rect) {
106 if (display_item_list_->RetainsIndividualDisplayItems()) { 85 display_item_list_->CreateAndAppendItem<cc::EndClipPathDisplayItem>(
107 display_item_list_->CreateAndAppendItem<cc::EndClipPathDisplayItem>( 86 visual_rect);
108 visual_rect);
109 } else {
110 display_item_list_->RasterIntoCanvas(cc::EndClipPathDisplayItem());
111 }
112 } 87 }
113 88
114 void WebDisplayItemListImpl::appendFloatClipItem( 89 void WebDisplayItemListImpl::appendFloatClipItem(
115 const blink::WebRect& visual_rect, 90 const blink::WebRect& visual_rect,
116 const blink::WebFloatRect& clip_rect) { 91 const blink::WebFloatRect& clip_rect) {
117 if (display_item_list_->RetainsIndividualDisplayItems()) { 92 display_item_list_->CreateAndAppendItem<cc::FloatClipDisplayItem>(visual_rect,
118 display_item_list_->CreateAndAppendItem<cc::FloatClipDisplayItem>( 93 clip_rect);
119 visual_rect, clip_rect);
120 } else {
121 cc::FloatClipDisplayItem item(clip_rect);
122 display_item_list_->RasterIntoCanvas(item);
123 }
124 } 94 }
125 95
126 void WebDisplayItemListImpl::appendEndFloatClipItem( 96 void WebDisplayItemListImpl::appendEndFloatClipItem(
127 const blink::WebRect& visual_rect) { 97 const blink::WebRect& visual_rect) {
128 if (display_item_list_->RetainsIndividualDisplayItems()) { 98 display_item_list_->CreateAndAppendItem<cc::EndFloatClipDisplayItem>(
129 display_item_list_->CreateAndAppendItem<cc::EndFloatClipDisplayItem>( 99 visual_rect);
130 visual_rect);
131 } else {
132 display_item_list_->RasterIntoCanvas(cc::EndFloatClipDisplayItem());
133 }
134 } 100 }
135 101
136 void WebDisplayItemListImpl::appendTransformItem( 102 void WebDisplayItemListImpl::appendTransformItem(
137 const blink::WebRect& visual_rect, 103 const blink::WebRect& visual_rect,
138 const SkMatrix44& matrix) { 104 const SkMatrix44& matrix) {
139 gfx::Transform transform(gfx::Transform::kSkipInitialization); 105 gfx::Transform transform(gfx::Transform::kSkipInitialization);
140 transform.matrix() = matrix; 106 transform.matrix() = matrix;
141 107
142 if (display_item_list_->RetainsIndividualDisplayItems()) { 108 display_item_list_->CreateAndAppendItem<cc::TransformDisplayItem>(visual_rect,
143 display_item_list_->CreateAndAppendItem<cc::TransformDisplayItem>( 109 transform);
144 visual_rect, transform);
145 } else {
146 cc::TransformDisplayItem item(transform);
147 display_item_list_->RasterIntoCanvas(item);
148 }
149 } 110 }
150 111
151 void WebDisplayItemListImpl::appendEndTransformItem( 112 void WebDisplayItemListImpl::appendEndTransformItem(
152 const blink::WebRect& visual_rect) { 113 const blink::WebRect& visual_rect) {
153 if (display_item_list_->RetainsIndividualDisplayItems()) { 114 display_item_list_->CreateAndAppendItem<cc::EndTransformDisplayItem>(
154 display_item_list_->CreateAndAppendItem<cc::EndTransformDisplayItem>( 115 visual_rect);
155 visual_rect);
156 } else {
157 display_item_list_->RasterIntoCanvas(cc::EndTransformDisplayItem());
158 }
159 } 116 }
160 117
161 void WebDisplayItemListImpl::appendCompositingItem( 118 void WebDisplayItemListImpl::appendCompositingItem(
162 const blink::WebRect& visual_rect, 119 const blink::WebRect& visual_rect,
163 float opacity, 120 float opacity,
164 SkXfermode::Mode xfermode, 121 SkXfermode::Mode xfermode,
165 SkRect* bounds, 122 SkRect* bounds,
166 SkColorFilter* color_filter) { 123 SkColorFilter* color_filter) {
167 DCHECK_GE(opacity, 0.f); 124 DCHECK_GE(opacity, 0.f);
168 DCHECK_LE(opacity, 1.f); 125 DCHECK_LE(opacity, 1.f);
169 // TODO(ajuma): This should really be rounding instead of flooring the alpha 126 // TODO(ajuma): This should really be rounding instead of flooring the alpha
170 // value, but that breaks slimming paint reftests. 127 // value, but that breaks slimming paint reftests.
171 128
172 const bool kLcdTextRequiresOpaqueLayer = true; 129 const bool kLcdTextRequiresOpaqueLayer = true;
173 if (display_item_list_->RetainsIndividualDisplayItems()) { 130 display_item_list_->CreateAndAppendItem<cc::CompositingDisplayItem>(
174 display_item_list_->CreateAndAppendItem<cc::CompositingDisplayItem>( 131 visual_rect, static_cast<uint8_t>(gfx::ToFlooredInt(255 * opacity)),
175 visual_rect, static_cast<uint8_t>(gfx::ToFlooredInt(255 * opacity)), 132 xfermode, bounds, sk_ref_sp(color_filter), kLcdTextRequiresOpaqueLayer);
176 xfermode, bounds, sk_ref_sp(color_filter), kLcdTextRequiresOpaqueLayer);
177 } else {
178 cc::CompositingDisplayItem item(
179 static_cast<uint8_t>(gfx::ToFlooredInt(255 * opacity)), xfermode,
180 bounds, sk_ref_sp(color_filter), kLcdTextRequiresOpaqueLayer);
181 display_item_list_->RasterIntoCanvas(item);
182 }
183 } 133 }
184 134
185 void WebDisplayItemListImpl::appendEndCompositingItem( 135 void WebDisplayItemListImpl::appendEndCompositingItem(
186 const blink::WebRect& visual_rect) { 136 const blink::WebRect& visual_rect) {
187 if (display_item_list_->RetainsIndividualDisplayItems()) { 137 display_item_list_->CreateAndAppendItem<cc::EndCompositingDisplayItem>(
188 display_item_list_->CreateAndAppendItem<cc::EndCompositingDisplayItem>( 138 visual_rect);
189 visual_rect);
190 } else {
191 display_item_list_->RasterIntoCanvas(cc::EndCompositingDisplayItem());
192 }
193 } 139 }
194 140
195 void WebDisplayItemListImpl::appendFilterItem( 141 void WebDisplayItemListImpl::appendFilterItem(
196 const blink::WebRect& visual_rect, 142 const blink::WebRect& visual_rect,
197 const cc::FilterOperations& filters, 143 const cc::FilterOperations& filters,
198 const blink::WebFloatRect& bounds) { 144 const blink::WebFloatRect& bounds) {
199 if (display_item_list_->RetainsIndividualDisplayItems()) { 145 display_item_list_->CreateAndAppendItem<cc::FilterDisplayItem>(
200 display_item_list_->CreateAndAppendItem<cc::FilterDisplayItem>( 146 visual_rect, filters, bounds);
201 visual_rect, filters, bounds);
202 } else {
203 cc::FilterDisplayItem item(filters, bounds);
204 display_item_list_->RasterIntoCanvas(item);
205 }
206 } 147 }
207 148
208 void WebDisplayItemListImpl::appendEndFilterItem( 149 void WebDisplayItemListImpl::appendEndFilterItem(
209 const blink::WebRect& visual_rect) { 150 const blink::WebRect& visual_rect) {
210 if (display_item_list_->RetainsIndividualDisplayItems()) { 151 display_item_list_->CreateAndAppendItem<cc::EndFilterDisplayItem>(
211 display_item_list_->CreateAndAppendItem<cc::EndFilterDisplayItem>( 152 visual_rect);
212 visual_rect);
213 } else {
214 display_item_list_->RasterIntoCanvas(cc::EndFilterDisplayItem());
215 }
216 } 153 }
217 154
218 void WebDisplayItemListImpl::appendScrollItem( 155 void WebDisplayItemListImpl::appendScrollItem(
219 const blink::WebRect& visual_rect, 156 const blink::WebRect& visual_rect,
220 const blink::WebSize& scroll_offset, 157 const blink::WebSize& scroll_offset,
221 ScrollContainerId) { 158 ScrollContainerId) {
222 SkMatrix44 matrix(SkMatrix44::kUninitialized_Constructor); 159 SkMatrix44 matrix(SkMatrix44::kUninitialized_Constructor);
223 matrix.setTranslate(-scroll_offset.width, -scroll_offset.height, 0); 160 matrix.setTranslate(-scroll_offset.width, -scroll_offset.height, 0);
224 // TODO(wkorman): Should we translate the visual rect as well? 161 // TODO(wkorman): Should we translate the visual rect as well? Create a test
vmpstr 2016/08/02 17:34:21 nit: can you file a bug if one doesn't exist?
wkorman 2016/08/02 18:15:09 Done.
162 // case and investigate.
225 appendTransformItem(visual_rect, matrix); 163 appendTransformItem(visual_rect, matrix);
226 } 164 }
227 165
228 void WebDisplayItemListImpl::appendEndScrollItem( 166 void WebDisplayItemListImpl::appendEndScrollItem(
229 const blink::WebRect& visual_rect) { 167 const blink::WebRect& visual_rect) {
230 appendEndTransformItem(visual_rect); 168 appendEndTransformItem(visual_rect);
231 } 169 }
232 170
233 void WebDisplayItemListImpl::setIsSuitableForGpuRasterization(bool isSuitable) { 171 void WebDisplayItemListImpl::setIsSuitableForGpuRasterization(bool isSuitable) {
234 display_item_list_->SetIsSuitableForGpuRasterization(isSuitable); 172 display_item_list_->SetIsSuitableForGpuRasterization(isSuitable);
235 } 173 }
236 174
237 WebDisplayItemListImpl::~WebDisplayItemListImpl() { 175 WebDisplayItemListImpl::~WebDisplayItemListImpl() {
238 } 176 }
239 177
240 } // namespace cc_blink 178 } // namespace cc_blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698