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

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

Issue 1835843002: WIP: Fix foreignObject cullrect Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 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
« no previous file with comments | « cc/blink/web_content_layer_impl.cc ('k') | cc/debug/rasterize_and_record_benchmark.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 15 matching lines...) Expand all
26 #include "ui/gfx/geometry/safe_integer_conversions.h" 26 #include "ui/gfx/geometry/safe_integer_conversions.h"
27 #include "ui/gfx/transform.h" 27 #include "ui/gfx/transform.h"
28 28
29 namespace cc_blink { 29 namespace cc_blink {
30 30
31 namespace { 31 namespace {
32 32
33 scoped_refptr<cc::DisplayItemList> CreateUncachedDisplayItemListForBlink() { 33 scoped_refptr<cc::DisplayItemList> CreateUncachedDisplayItemListForBlink() {
34 cc::DisplayItemListSettings settings; 34 cc::DisplayItemListSettings settings;
35 settings.use_cached_picture = false; 35 settings.use_cached_picture = false;
36 gfx::Rect layer_rect; 36 return cc::DisplayItemList::Create(settings);
37 return cc::DisplayItemList::Create(layer_rect, settings);
38 } 37 }
39 38
40 } // namespace 39 } // namespace
41 40
42 WebDisplayItemListImpl::WebDisplayItemListImpl() 41 WebDisplayItemListImpl::WebDisplayItemListImpl()
43 : display_item_list_(CreateUncachedDisplayItemListForBlink()) { 42 : display_item_list_(CreateUncachedDisplayItemListForBlink()) {
44 } 43 }
45 44
46 WebDisplayItemListImpl::WebDisplayItemListImpl( 45 WebDisplayItemListImpl::WebDisplayItemListImpl(
47 cc::DisplayItemList* display_list) 46 cc::DisplayItemList* display_list)
48 : display_item_list_(display_list) { 47 : display_item_list_(display_list) {
49 } 48 }
50 49
51 void WebDisplayItemListImpl::appendDrawingItem( 50 void WebDisplayItemListImpl::appendDrawingItem(
52 const blink::WebRect& visual_rect, 51 const blink::WebRect& visual_rect,
53 sk_sp<const SkPicture> picture) { 52 sk_sp<const SkPicture> picture) {
54 if (display_item_list_->RetainsIndividualDisplayItems()) { 53 display_item_list_->CreateAndAppendItem<cc::DrawingDisplayItem>(
55 display_item_list_->CreateAndAppendItem<cc::DrawingDisplayItem>( 54 visual_rect, std::move(picture));
56 visual_rect, std::move(picture));
57 } else {
58 cc::DrawingDisplayItem item(std::move(picture));
59 display_item_list_->RasterIntoCanvas(item);
60 }
61 } 55 }
62 56
63 void WebDisplayItemListImpl::appendClipItem( 57 void WebDisplayItemListImpl::appendClipItem(
64 const blink::WebRect& visual_rect, 58 const blink::WebRect& visual_rect,
65 const blink::WebRect& clip_rect, 59 const blink::WebRect& clip_rect,
66 const blink::WebVector<SkRRect>& rounded_clip_rects) { 60 const blink::WebVector<SkRRect>& rounded_clip_rects) {
67 std::vector<SkRRect> rounded_rects; 61 std::vector<SkRRect> rounded_rects;
68 for (size_t i = 0; i < rounded_clip_rects.size(); ++i) { 62 for (size_t i = 0; i < rounded_clip_rects.size(); ++i) {
69 rounded_rects.push_back(rounded_clip_rects[i]); 63 rounded_rects.push_back(rounded_clip_rects[i]);
70 } 64 }
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);
73 visual_rect, clip_rect, rounded_rects);
74 } else {
75 cc::ClipDisplayItem item(clip_rect, rounded_rects);
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, skia::SharePtr(color_filter),
176 xfermode, bounds, skia::SharePtr(color_filter), 133 kLcdTextRequiresOpaqueLayer);
177 kLcdTextRequiresOpaqueLayer);
178 } else {
179 cc::CompositingDisplayItem item(
180 static_cast<uint8_t>(gfx::ToFlooredInt(255 * opacity)), xfermode,
181 bounds, skia::SharePtr(color_filter), kLcdTextRequiresOpaqueLayer);
182 display_item_list_->RasterIntoCanvas(item);
183 }
184 } 134 }
185 135
186 void WebDisplayItemListImpl::appendEndCompositingItem( 136 void WebDisplayItemListImpl::appendEndCompositingItem(
187 const blink::WebRect& visual_rect) { 137 const blink::WebRect& visual_rect) {
188 if (display_item_list_->RetainsIndividualDisplayItems()) { 138 display_item_list_->CreateAndAppendItem<cc::EndCompositingDisplayItem>(
189 display_item_list_->CreateAndAppendItem<cc::EndCompositingDisplayItem>( 139 visual_rect);
190 visual_rect);
191 } else {
192 display_item_list_->RasterIntoCanvas(cc::EndCompositingDisplayItem());
193 }
194 } 140 }
195 141
196 void WebDisplayItemListImpl::appendFilterItem( 142 void WebDisplayItemListImpl::appendFilterItem(
197 const blink::WebRect& visual_rect, 143 const blink::WebRect& visual_rect,
198 const cc::FilterOperations& filters, 144 const cc::FilterOperations& filters,
199 const blink::WebFloatRect& bounds) { 145 const blink::WebFloatRect& bounds) {
200 if (display_item_list_->RetainsIndividualDisplayItems()) { 146 display_item_list_->CreateAndAppendItem<cc::FilterDisplayItem>(
201 display_item_list_->CreateAndAppendItem<cc::FilterDisplayItem>( 147 visual_rect, filters, bounds);
202 visual_rect, filters, bounds);
203 } else {
204 cc::FilterDisplayItem item(filters, bounds);
205 display_item_list_->RasterIntoCanvas(item);
206 }
207 } 148 }
208 149
209 void WebDisplayItemListImpl::appendEndFilterItem( 150 void WebDisplayItemListImpl::appendEndFilterItem(
210 const blink::WebRect& visual_rect) { 151 const blink::WebRect& visual_rect) {
211 if (display_item_list_->RetainsIndividualDisplayItems()) { 152 display_item_list_->CreateAndAppendItem<cc::EndFilterDisplayItem>(
212 display_item_list_->CreateAndAppendItem<cc::EndFilterDisplayItem>( 153 visual_rect);
213 visual_rect);
214 } else {
215 display_item_list_->RasterIntoCanvas(cc::EndFilterDisplayItem());
216 }
217 } 154 }
218 155
219 void WebDisplayItemListImpl::appendScrollItem( 156 void WebDisplayItemListImpl::appendScrollItem(
220 const blink::WebRect& visual_rect, 157 const blink::WebRect& visual_rect,
221 const blink::WebSize& scroll_offset, 158 const blink::WebSize& scroll_offset,
222 ScrollContainerId) { 159 ScrollContainerId) {
223 SkMatrix44 matrix(SkMatrix44::kUninitialized_Constructor); 160 SkMatrix44 matrix(SkMatrix44::kUninitialized_Constructor);
224 matrix.setTranslate(-scroll_offset.width, -scroll_offset.height, 0); 161 matrix.setTranslate(-scroll_offset.width, -scroll_offset.height, 0);
225 // TODO(wkorman): Should we translate the visual rect as well? 162 // TODO(wkorman): Should we translate the visual rect as well? Create a test
163 // case and investigate.
226 appendTransformItem(visual_rect, matrix); 164 appendTransformItem(visual_rect, matrix);
227 } 165 }
228 166
229 void WebDisplayItemListImpl::appendEndScrollItem( 167 void WebDisplayItemListImpl::appendEndScrollItem(
230 const blink::WebRect& visual_rect) { 168 const blink::WebRect& visual_rect) {
231 appendEndTransformItem(visual_rect); 169 appendEndTransformItem(visual_rect);
232 } 170 }
233 171
234 WebDisplayItemListImpl::~WebDisplayItemListImpl() { 172 WebDisplayItemListImpl::~WebDisplayItemListImpl() {
235 } 173 }
236 174
237 } // namespace cc_blink 175 } // namespace cc_blink
OLDNEW
« no previous file with comments | « cc/blink/web_content_layer_impl.cc ('k') | cc/debug/rasterize_and_record_benchmark.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698