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

Side by Side Diff: cc/raster/image_hijack_canvas.cc

Issue 2842333003: cc: Update discardable image metadata generation to get PaintImages. (Closed)
Patch Set: win Created 3 years, 7 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/raster/image_hijack_canvas.h ('k') | cc/raster/image_hijack_canvas_unittest.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 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/raster/image_hijack_canvas.h" 5 #include "cc/raster/image_hijack_canvas.h"
6 6
7 #include "base/optional.h" 7 #include "base/optional.h"
8 #include "base/trace_event/trace_event.h" 8 #include "base/trace_event/trace_event.h"
9 #include "cc/paint/discardable_image_map.h" 9 #include "cc/paint/discardable_image_map.h"
10 #include "cc/tiles/image_decode_cache.h" 10 #include "cc/tiles/image_decode_cache.h"
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
149 // forwarded to the raster canvas. 149 // forwarded to the raster canvas.
150 SkCanvas::onDrawPicture(picture, matrix, paint); 150 SkCanvas::onDrawPicture(picture, matrix, paint);
151 } 151 }
152 152
153 void ImageHijackCanvas::onDrawImage(const SkImage* image, 153 void ImageHijackCanvas::onDrawImage(const SkImage* image,
154 SkScalar x, 154 SkScalar x,
155 SkScalar y, 155 SkScalar y,
156 const SkPaint* paint) { 156 const SkPaint* paint) {
157 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), 157 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
158 "ImageHijackCanvas::onDrawImage"); 158 "ImageHijackCanvas::onDrawImage");
159 SkRect rect = SkRect::MakeXYWH(x, y, SkIntToScalar(image->width()),
160 SkIntToScalar(image->height()));
161 if (QuickRejectDraw(rect, paint))
162 return;
163
159 if (!image->isLazyGenerated()) { 164 if (!image->isLazyGenerated()) {
160 DCHECK(!ShouldSkipImage(image)); 165 DCHECK(!ShouldSkipImage(image));
161 SkNWayCanvas::onDrawImage(image, x, y, paint); 166 SkNWayCanvas::onDrawImage(image, x, y, paint);
162 return; 167 return;
163 } 168 }
164 169
165 if (ShouldSkipImage(image)) 170 if (ShouldSkipImage(image))
166 return; 171 return;
167 172
168 SkMatrix ctm = getTotalMatrix(); 173 SkMatrix ctm = getTotalMatrix();
(...skipping 21 matching lines...) Expand all
190 SkNWayCanvas::restore(); 195 SkNWayCanvas::restore();
191 } 196 }
192 197
193 void ImageHijackCanvas::onDrawImageRect(const SkImage* image, 198 void ImageHijackCanvas::onDrawImageRect(const SkImage* image,
194 const SkRect* src, 199 const SkRect* src,
195 const SkRect& dst, 200 const SkRect& dst,
196 const SkPaint* paint, 201 const SkPaint* paint,
197 SrcRectConstraint constraint) { 202 SrcRectConstraint constraint) {
198 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), 203 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
199 "ImageHijackCanvas::onDrawImageRect"); 204 "ImageHijackCanvas::onDrawImageRect");
205 if (QuickRejectDraw(dst, paint))
206 return;
207
200 if (!image->isLazyGenerated()) { 208 if (!image->isLazyGenerated()) {
201 DCHECK(!ShouldSkipImage(image)); 209 DCHECK(!ShouldSkipImage(image));
202 SkNWayCanvas::onDrawImageRect(image, src, dst, paint, constraint); 210 SkNWayCanvas::onDrawImageRect(image, src, dst, paint, constraint);
203 return; 211 return;
204 } 212 }
205 213
206 if (ShouldSkipImage(image)) 214 if (ShouldSkipImage(image))
207 return; 215 return;
208 216
209 SkRect src_storage; 217 SkRect src_storage;
(...skipping 23 matching lines...) Expand all
233 adjusted_src.x() * x_scale, adjusted_src.y() * y_scale, 241 adjusted_src.x() * x_scale, adjusted_src.y() * y_scale,
234 adjusted_src.width() * x_scale, adjusted_src.height() * y_scale); 242 adjusted_src.width() * x_scale, adjusted_src.height() * y_scale);
235 } 243 }
236 SkNWayCanvas::onDrawImageRect(decoded_image.image().get(), &adjusted_src, dst, 244 SkNWayCanvas::onDrawImageRect(decoded_image.image().get(), &adjusted_src, dst,
237 decoded_paint, constraint); 245 decoded_paint, constraint);
238 } 246 }
239 247
240 void ImageHijackCanvas::onDrawRect(const SkRect& r, const SkPaint& paint) { 248 void ImageHijackCanvas::onDrawRect(const SkRect& r, const SkPaint& paint) {
241 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), 249 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
242 "ImageHijackCanvas::onDrawRect"); 250 "ImageHijackCanvas::onDrawRect");
251 if (QuickRejectDraw(r, &paint))
252 return;
253
243 if (ShouldSkipImageInPaint(paint)) 254 if (ShouldSkipImageInPaint(paint))
244 return; 255 return;
245 256
246 base::Optional<ScopedImagePaint> image_paint = ScopedImagePaint::TryCreate( 257 base::Optional<ScopedImagePaint> image_paint = ScopedImagePaint::TryCreate(
247 image_decode_cache_, getTotalMatrix(), paint, target_color_space_); 258 image_decode_cache_, getTotalMatrix(), paint, target_color_space_);
248 if (!image_paint.has_value()) { 259 if (!image_paint.has_value()) {
249 SkNWayCanvas::onDrawRect(r, paint); 260 SkNWayCanvas::onDrawRect(r, paint);
250 return; 261 return;
251 } 262 }
252 SkNWayCanvas::onDrawRect(r, image_paint.value().paint()); 263 SkNWayCanvas::onDrawRect(r, image_paint.value().paint());
253 } 264 }
254 265
255 void ImageHijackCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) { 266 void ImageHijackCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) {
256 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), 267 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
257 "ImageHijackCanvas::onDrawPath"); 268 "ImageHijackCanvas::onDrawPath");
269 if (QuickRejectDraw(path.getBounds(), &paint))
270 return;
271
258 if (ShouldSkipImageInPaint(paint)) 272 if (ShouldSkipImageInPaint(paint))
259 return; 273 return;
260 274
261 base::Optional<ScopedImagePaint> image_paint = ScopedImagePaint::TryCreate( 275 base::Optional<ScopedImagePaint> image_paint = ScopedImagePaint::TryCreate(
262 image_decode_cache_, getTotalMatrix(), paint, target_color_space_); 276 image_decode_cache_, getTotalMatrix(), paint, target_color_space_);
263 if (!image_paint.has_value()) { 277 if (!image_paint.has_value()) {
264 SkNWayCanvas::onDrawPath(path, paint); 278 SkNWayCanvas::onDrawPath(path, paint);
265 return; 279 return;
266 } 280 }
267 SkNWayCanvas::onDrawPath(path, image_paint.value().paint()); 281 SkNWayCanvas::onDrawPath(path, image_paint.value().paint());
268 } 282 }
269 283
270 void ImageHijackCanvas::onDrawOval(const SkRect& r, const SkPaint& paint) { 284 void ImageHijackCanvas::onDrawOval(const SkRect& r, const SkPaint& paint) {
271 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), 285 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
272 "ImageHijackCanvas::onDrawOval"); 286 "ImageHijackCanvas::onDrawOval");
287 if (QuickRejectDraw(r, &paint))
288 return;
289
273 if (ShouldSkipImageInPaint(paint)) 290 if (ShouldSkipImageInPaint(paint))
274 return; 291 return;
275 292
276 base::Optional<ScopedImagePaint> image_paint = ScopedImagePaint::TryCreate( 293 base::Optional<ScopedImagePaint> image_paint = ScopedImagePaint::TryCreate(
277 image_decode_cache_, getTotalMatrix(), paint, target_color_space_); 294 image_decode_cache_, getTotalMatrix(), paint, target_color_space_);
278 if (!image_paint.has_value()) { 295 if (!image_paint.has_value()) {
279 SkNWayCanvas::onDrawOval(r, paint); 296 SkNWayCanvas::onDrawOval(r, paint);
280 return; 297 return;
281 } 298 }
282 SkNWayCanvas::onDrawOval(r, image_paint.value().paint()); 299 SkNWayCanvas::onDrawOval(r, image_paint.value().paint());
283 } 300 }
284 301
285 void ImageHijackCanvas::onDrawArc(const SkRect& r, 302 void ImageHijackCanvas::onDrawArc(const SkRect& r,
286 SkScalar start_angle, 303 SkScalar start_angle,
287 SkScalar sweep_angle, 304 SkScalar sweep_angle,
288 bool use_center, 305 bool use_center,
289 const SkPaint& paint) { 306 const SkPaint& paint) {
290 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), 307 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
291 "ImageHijackCanvas::onDrawArc"); 308 "ImageHijackCanvas::onDrawArc");
309 if (QuickRejectDraw(r, &paint))
310 return;
311
292 if (ShouldSkipImageInPaint(paint)) 312 if (ShouldSkipImageInPaint(paint))
293 return; 313 return;
294 314
295 base::Optional<ScopedImagePaint> image_paint = ScopedImagePaint::TryCreate( 315 base::Optional<ScopedImagePaint> image_paint = ScopedImagePaint::TryCreate(
296 image_decode_cache_, getTotalMatrix(), paint, target_color_space_); 316 image_decode_cache_, getTotalMatrix(), paint, target_color_space_);
297 if (!image_paint.has_value()) { 317 if (!image_paint.has_value()) {
298 SkNWayCanvas::onDrawArc(r, start_angle, sweep_angle, use_center, paint); 318 SkNWayCanvas::onDrawArc(r, start_angle, sweep_angle, use_center, paint);
299 return; 319 return;
300 } 320 }
301 SkNWayCanvas::onDrawArc(r, start_angle, sweep_angle, use_center, 321 SkNWayCanvas::onDrawArc(r, start_angle, sweep_angle, use_center,
302 image_paint.value().paint()); 322 image_paint.value().paint());
303 } 323 }
304 324
305 void ImageHijackCanvas::onDrawRRect(const SkRRect& rr, const SkPaint& paint) { 325 void ImageHijackCanvas::onDrawRRect(const SkRRect& rr, const SkPaint& paint) {
306 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), 326 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
307 "ImageHijackCanvas::onDrawRRect"); 327 "ImageHijackCanvas::onDrawRRect");
328 if (QuickRejectDraw(rr.rect(), &paint))
329 return;
330
308 if (ShouldSkipImageInPaint(paint)) 331 if (ShouldSkipImageInPaint(paint))
309 return; 332 return;
310 333
311 base::Optional<ScopedImagePaint> image_paint = ScopedImagePaint::TryCreate( 334 base::Optional<ScopedImagePaint> image_paint = ScopedImagePaint::TryCreate(
312 image_decode_cache_, getTotalMatrix(), paint, target_color_space_); 335 image_decode_cache_, getTotalMatrix(), paint, target_color_space_);
313 if (!image_paint.has_value()) { 336 if (!image_paint.has_value()) {
314 SkNWayCanvas::onDrawRRect(rr, paint); 337 SkNWayCanvas::onDrawRRect(rr, paint);
315 return; 338 return;
316 } 339 }
317 SkNWayCanvas::onDrawRRect(rr, image_paint.value().paint()); 340 SkNWayCanvas::onDrawRRect(rr, image_paint.value().paint());
(...skipping 14 matching lines...) Expand all
332 "ImageHijackCanvas::ShouldSkipImage", "imageId", 355 "ImageHijackCanvas::ShouldSkipImage", "imageId",
333 image->uniqueID(), "skip", skip); 356 image->uniqueID(), "skip", skip);
334 return skip; 357 return skip;
335 } 358 }
336 359
337 bool ImageHijackCanvas::ShouldSkipImageInPaint(const SkPaint& paint) const { 360 bool ImageHijackCanvas::ShouldSkipImageInPaint(const SkPaint& paint) const {
338 const SkImage* image = GetImageInPaint(paint); 361 const SkImage* image = GetImageInPaint(paint);
339 return image ? ShouldSkipImage(image) : false; 362 return image ? ShouldSkipImage(image) : false;
340 } 363 }
341 364
365 bool ImageHijackCanvas::QuickRejectDraw(const SkRect& rect,
366 const SkPaint* paint) const {
367 if (nullptr == paint || paint->canComputeFastBounds()) {
368 SkRect tmp = rect;
369 if (paint)
370 paint->computeFastBounds(tmp, &tmp);
371 return quickReject(tmp);
372 }
373
374 return false;
375 }
376
342 } // namespace cc 377 } // namespace cc
OLDNEW
« no previous file with comments | « cc/raster/image_hijack_canvas.h ('k') | cc/raster/image_hijack_canvas_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698