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

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: Sync to head and flip for LayoutInline. Created 4 years, 6 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 if (display_item_list_->RetainsIndividualDisplayItems()) { 64 display_item_list_->CreateAndAppendItem<cc::ClipDisplayItem>(
71 display_item_list_->CreateAndAppendItem<cc::ClipDisplayItem>( 65 visual_rect, clip_rect, rounded_rects);
72 visual_rect, clip_rect, rounded_rects);
73 } else {
74 cc::ClipDisplayItem item(clip_rect, rounded_rects);
75 display_item_list_->RasterIntoCanvas(item);
76 }
77 } 66 }
78 67
79 void WebDisplayItemListImpl::appendEndClipItem( 68 void WebDisplayItemListImpl::appendEndClipItem(
80 const blink::WebRect& visual_rect) { 69 const blink::WebRect& visual_rect) {
81 if (display_item_list_->RetainsIndividualDisplayItems()) { 70 display_item_list_->CreateAndAppendItem<cc::EndClipDisplayItem>(visual_rect);
82 display_item_list_->CreateAndAppendItem<cc::EndClipDisplayItem>(
83 visual_rect);
84 } else {
85 display_item_list_->RasterIntoCanvas(cc::EndClipDisplayItem());
86 }
87 } 71 }
88 72
89 void WebDisplayItemListImpl::appendClipPathItem( 73 void WebDisplayItemListImpl::appendClipPathItem(
90 const blink::WebRect& visual_rect, 74 const blink::WebRect& visual_rect,
91 const SkPath& clip_path, 75 const SkPath& clip_path,
92 SkRegion::Op clip_op, 76 SkRegion::Op clip_op,
93 bool antialias) { 77 bool antialias) {
94 if (display_item_list_->RetainsIndividualDisplayItems()) { 78 display_item_list_->CreateAndAppendItem<cc::ClipPathDisplayItem>(
95 display_item_list_->CreateAndAppendItem<cc::ClipPathDisplayItem>( 79 visual_rect, clip_path, clip_op, antialias);
96 visual_rect, clip_path, clip_op, antialias);
97 } else {
98 cc::ClipPathDisplayItem item(clip_path, clip_op, antialias);
99 display_item_list_->RasterIntoCanvas(item);
100 }
101 } 80 }
102 81
103 void WebDisplayItemListImpl::appendEndClipPathItem( 82 void WebDisplayItemListImpl::appendEndClipPathItem(
104 const blink::WebRect& visual_rect) { 83 const blink::WebRect& visual_rect) {
105 if (display_item_list_->RetainsIndividualDisplayItems()) { 84 display_item_list_->CreateAndAppendItem<cc::EndClipPathDisplayItem>(
106 display_item_list_->CreateAndAppendItem<cc::EndClipPathDisplayItem>( 85 visual_rect);
107 visual_rect);
108 } else {
109 display_item_list_->RasterIntoCanvas(cc::EndClipPathDisplayItem());
110 }
111 } 86 }
112 87
113 void WebDisplayItemListImpl::appendFloatClipItem( 88 void WebDisplayItemListImpl::appendFloatClipItem(
114 const blink::WebRect& visual_rect, 89 const blink::WebRect& visual_rect,
115 const blink::WebFloatRect& clip_rect) { 90 const blink::WebFloatRect& clip_rect) {
116 if (display_item_list_->RetainsIndividualDisplayItems()) { 91 display_item_list_->CreateAndAppendItem<cc::FloatClipDisplayItem>(visual_rect,
117 display_item_list_->CreateAndAppendItem<cc::FloatClipDisplayItem>( 92 clip_rect);
118 visual_rect, clip_rect);
119 } else {
120 cc::FloatClipDisplayItem item(clip_rect);
121 display_item_list_->RasterIntoCanvas(item);
122 }
123 } 93 }
124 94
125 void WebDisplayItemListImpl::appendEndFloatClipItem( 95 void WebDisplayItemListImpl::appendEndFloatClipItem(
126 const blink::WebRect& visual_rect) { 96 const blink::WebRect& visual_rect) {
127 if (display_item_list_->RetainsIndividualDisplayItems()) { 97 display_item_list_->CreateAndAppendItem<cc::EndFloatClipDisplayItem>(
128 display_item_list_->CreateAndAppendItem<cc::EndFloatClipDisplayItem>( 98 visual_rect);
129 visual_rect);
130 } else {
131 display_item_list_->RasterIntoCanvas(cc::EndFloatClipDisplayItem());
132 }
133 } 99 }
134 100
135 void WebDisplayItemListImpl::appendTransformItem( 101 void WebDisplayItemListImpl::appendTransformItem(
136 const blink::WebRect& visual_rect, 102 const blink::WebRect& visual_rect,
137 const SkMatrix44& matrix) { 103 const SkMatrix44& matrix) {
138 gfx::Transform transform(gfx::Transform::kSkipInitialization); 104 gfx::Transform transform(gfx::Transform::kSkipInitialization);
139 transform.matrix() = matrix; 105 transform.matrix() = matrix;
140 106
141 if (display_item_list_->RetainsIndividualDisplayItems()) { 107 display_item_list_->CreateAndAppendItem<cc::TransformDisplayItem>(visual_rect,
142 display_item_list_->CreateAndAppendItem<cc::TransformDisplayItem>( 108 transform);
143 visual_rect, transform);
144 } else {
145 cc::TransformDisplayItem item(transform);
146 display_item_list_->RasterIntoCanvas(item);
147 }
148 } 109 }
149 110
150 void WebDisplayItemListImpl::appendEndTransformItem( 111 void WebDisplayItemListImpl::appendEndTransformItem(
151 const blink::WebRect& visual_rect) { 112 const blink::WebRect& visual_rect) {
152 if (display_item_list_->RetainsIndividualDisplayItems()) { 113 display_item_list_->CreateAndAppendItem<cc::EndTransformDisplayItem>(
153 display_item_list_->CreateAndAppendItem<cc::EndTransformDisplayItem>( 114 visual_rect);
154 visual_rect);
155 } else {
156 display_item_list_->RasterIntoCanvas(cc::EndTransformDisplayItem());
157 }
158 } 115 }
159 116
160 void WebDisplayItemListImpl::appendCompositingItem( 117 void WebDisplayItemListImpl::appendCompositingItem(
161 const blink::WebRect& visual_rect, 118 const blink::WebRect& visual_rect,
162 float opacity, 119 float opacity,
163 SkXfermode::Mode xfermode, 120 SkXfermode::Mode xfermode,
164 SkRect* bounds, 121 SkRect* bounds,
165 SkColorFilter* color_filter) { 122 SkColorFilter* color_filter) {
166 DCHECK_GE(opacity, 0.f); 123 DCHECK_GE(opacity, 0.f);
167 DCHECK_LE(opacity, 1.f); 124 DCHECK_LE(opacity, 1.f);
168 // TODO(ajuma): This should really be rounding instead of flooring the alpha 125 // TODO(ajuma): This should really be rounding instead of flooring the alpha
169 // value, but that breaks slimming paint reftests. 126 // value, but that breaks slimming paint reftests.
170 127
171 const bool kLcdTextRequiresOpaqueLayer = true; 128 const bool kLcdTextRequiresOpaqueLayer = true;
172 if (display_item_list_->RetainsIndividualDisplayItems()) { 129 display_item_list_->CreateAndAppendItem<cc::CompositingDisplayItem>(
173 display_item_list_->CreateAndAppendItem<cc::CompositingDisplayItem>( 130 visual_rect, static_cast<uint8_t>(gfx::ToFlooredInt(255 * opacity)),
174 visual_rect, static_cast<uint8_t>(gfx::ToFlooredInt(255 * opacity)), 131 xfermode, bounds, sk_ref_sp(color_filter), kLcdTextRequiresOpaqueLayer);
175 xfermode, bounds, sk_ref_sp(color_filter), kLcdTextRequiresOpaqueLayer);
176 } else {
177 cc::CompositingDisplayItem item(
178 static_cast<uint8_t>(gfx::ToFlooredInt(255 * opacity)), xfermode,
179 bounds, sk_ref_sp(color_filter), kLcdTextRequiresOpaqueLayer);
180 display_item_list_->RasterIntoCanvas(item);
181 }
182 } 132 }
183 133
184 void WebDisplayItemListImpl::appendEndCompositingItem( 134 void WebDisplayItemListImpl::appendEndCompositingItem(
185 const blink::WebRect& visual_rect) { 135 const blink::WebRect& visual_rect) {
186 if (display_item_list_->RetainsIndividualDisplayItems()) { 136 display_item_list_->CreateAndAppendItem<cc::EndCompositingDisplayItem>(
187 display_item_list_->CreateAndAppendItem<cc::EndCompositingDisplayItem>( 137 visual_rect);
188 visual_rect);
189 } else {
190 display_item_list_->RasterIntoCanvas(cc::EndCompositingDisplayItem());
191 }
192 } 138 }
193 139
194 void WebDisplayItemListImpl::appendFilterItem( 140 void WebDisplayItemListImpl::appendFilterItem(
195 const blink::WebRect& visual_rect, 141 const blink::WebRect& visual_rect,
196 const cc::FilterOperations& filters, 142 const cc::FilterOperations& filters,
197 const blink::WebFloatRect& bounds) { 143 const blink::WebFloatRect& bounds) {
198 if (display_item_list_->RetainsIndividualDisplayItems()) { 144 display_item_list_->CreateAndAppendItem<cc::FilterDisplayItem>(
199 display_item_list_->CreateAndAppendItem<cc::FilterDisplayItem>( 145 visual_rect, filters, bounds);
200 visual_rect, filters, bounds);
201 } else {
202 cc::FilterDisplayItem item(filters, bounds);
203 display_item_list_->RasterIntoCanvas(item);
204 }
205 } 146 }
206 147
207 void WebDisplayItemListImpl::appendEndFilterItem( 148 void WebDisplayItemListImpl::appendEndFilterItem(
208 const blink::WebRect& visual_rect) { 149 const blink::WebRect& visual_rect) {
209 if (display_item_list_->RetainsIndividualDisplayItems()) { 150 display_item_list_->CreateAndAppendItem<cc::EndFilterDisplayItem>(
210 display_item_list_->CreateAndAppendItem<cc::EndFilterDisplayItem>( 151 visual_rect);
211 visual_rect);
212 } else {
213 display_item_list_->RasterIntoCanvas(cc::EndFilterDisplayItem());
214 }
215 } 152 }
216 153
217 void WebDisplayItemListImpl::appendScrollItem( 154 void WebDisplayItemListImpl::appendScrollItem(
218 const blink::WebRect& visual_rect, 155 const blink::WebRect& visual_rect,
219 const blink::WebSize& scroll_offset, 156 const blink::WebSize& scroll_offset,
220 ScrollContainerId) { 157 ScrollContainerId) {
221 SkMatrix44 matrix(SkMatrix44::kUninitialized_Constructor); 158 SkMatrix44 matrix(SkMatrix44::kUninitialized_Constructor);
222 matrix.setTranslate(-scroll_offset.width, -scroll_offset.height, 0); 159 matrix.setTranslate(-scroll_offset.width, -scroll_offset.height, 0);
223 // TODO(wkorman): Should we translate the visual rect as well? 160 // TODO(wkorman): Should we translate the visual rect as well? Create a test
161 // case and investigate.
224 appendTransformItem(visual_rect, matrix); 162 appendTransformItem(visual_rect, matrix);
225 } 163 }
226 164
227 void WebDisplayItemListImpl::appendEndScrollItem( 165 void WebDisplayItemListImpl::appendEndScrollItem(
228 const blink::WebRect& visual_rect) { 166 const blink::WebRect& visual_rect) {
229 appendEndTransformItem(visual_rect); 167 appendEndTransformItem(visual_rect);
230 } 168 }
231 169
232 void WebDisplayItemListImpl::setIsSuitableForGpuRasterization(bool isSuitable) { 170 void WebDisplayItemListImpl::setIsSuitableForGpuRasterization(bool isSuitable) {
233 display_item_list_->SetIsSuitableForGpuRasterization(isSuitable); 171 display_item_list_->SetIsSuitableForGpuRasterization(isSuitable);
234 } 172 }
235 173
236 WebDisplayItemListImpl::~WebDisplayItemListImpl() { 174 WebDisplayItemListImpl::~WebDisplayItemListImpl() {
237 } 175 }
238 176
239 } // namespace cc_blink 177 } // namespace cc_blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698