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

Side by Side Diff: skia/ext/analysis_canvas.cc

Issue 2425323002: Abort canvas analysis after a few operations are rejected (Closed)
Patch Set: Update comments Created 4 years, 2 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 | « skia/ext/analysis_canvas.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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 "base/logging.h" 5 #include "base/logging.h"
6 #include "base/trace_event/trace_event.h" 6 #include "base/trace_event/trace_event.h"
7 #include "skia/ext/analysis_canvas.h" 7 #include "skia/ext/analysis_canvas.h"
8 #include "third_party/skia/include/core/SkDraw.h" 8 #include "third_party/skia/include/core/SkDraw.h"
9 #include "third_party/skia/include/core/SkPath.h" 9 #include "third_party/skia/include/core/SkPath.h"
10 #include "third_party/skia/include/core/SkRRect.h" 10 #include "third_party/skia/include/core/SkRRect.h"
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 47
48 // Returns true if the specified drawn_rect will cover the entire canvas, and 48 // Returns true if the specified drawn_rect will cover the entire canvas, and
49 // that the canvas is not clipped (i.e. it covers ALL of the canvas). 49 // that the canvas is not clipped (i.e. it covers ALL of the canvas).
50 bool IsFullQuad(SkCanvas* canvas, const SkRect& drawn_rect) { 50 bool IsFullQuad(SkCanvas* canvas, const SkRect& drawn_rect) {
51 if (!canvas->isClipRect()) 51 if (!canvas->isClipRect())
52 return false; 52 return false;
53 53
54 SkIRect clip_irect; 54 SkIRect clip_irect;
55 if (!canvas->getClipDeviceBounds(&clip_irect)) 55 if (!canvas->getClipDeviceBounds(&clip_irect))
56 return false; 56 return false;
57 57
58 // if the clip is smaller than the canvas, we're partly clipped, so abort. 58 // if the clip is smaller than the canvas, we're partly clipped, so abort.
59 if (!clip_irect.contains(SkIRect::MakeSize(canvas->getBaseLayerSize()))) 59 if (!clip_irect.contains(SkIRect::MakeSize(canvas->getBaseLayerSize())))
60 return false; 60 return false;
61 61
62 const SkMatrix& matrix = canvas->getTotalMatrix(); 62 const SkMatrix& matrix = canvas->getTotalMatrix();
63 // If the transform results in a non-axis aligned 63 // If the transform results in a non-axis aligned
64 // rect, then be conservative and return false. 64 // rect, then be conservative and return false.
65 if (!matrix.rectStaysRect()) 65 if (!matrix.rectStaysRect())
66 return false; 66 return false;
67 67
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 } 106 }
107 107
108 void AnalysisCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) { 108 void AnalysisCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) {
109 TRACE_EVENT0("disabled-by-default-skia", "AnalysisCanvas::onDrawRect"); 109 TRACE_EVENT0("disabled-by-default-skia", "AnalysisCanvas::onDrawRect");
110 // This recreates the early-exit logic in SkCanvas.cpp. 110 // This recreates the early-exit logic in SkCanvas.cpp.
111 SkRect scratch; 111 SkRect scratch;
112 if (paint.canComputeFastBounds() && 112 if (paint.canComputeFastBounds() &&
113 quickReject(paint.computeFastBounds(rect, &scratch))) { 113 quickReject(paint.computeFastBounds(rect, &scratch))) {
114 TRACE_EVENT_INSTANT0("disabled-by-default-skia", "Quick reject.", 114 TRACE_EVENT_INSTANT0("disabled-by-default-skia", "Quick reject.",
115 TRACE_EVENT_SCOPE_THREAD); 115 TRACE_EVENT_SCOPE_THREAD);
116 ++rejected_op_count_;
116 return; 117 return;
117 } 118 }
118 119
119 // An extra no-op check SkCanvas.cpp doesn't do. 120 // An extra no-op check SkCanvas.cpp doesn't do.
120 if (paint.nothingToDraw()) { 121 if (paint.nothingToDraw()) {
121 TRACE_EVENT_INSTANT0("disabled-by-default-skia", "Nothing to draw.", 122 TRACE_EVENT_INSTANT0("disabled-by-default-skia", "Nothing to draw.",
122 TRACE_EVENT_SCOPE_THREAD); 123 TRACE_EVENT_SCOPE_THREAD);
123 return; 124 return;
124 } 125 }
125 126
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
342 AnalysisCanvas::AnalysisCanvas(int width, int height) 343 AnalysisCanvas::AnalysisCanvas(int width, int height)
343 : INHERITED(MakeEmptyBitmap(width, height)), 344 : INHERITED(MakeEmptyBitmap(width, height)),
344 saved_stack_size_(0), 345 saved_stack_size_(0),
345 force_not_solid_stack_level_(kNoLayer), 346 force_not_solid_stack_level_(kNoLayer),
346 force_not_transparent_stack_level_(kNoLayer), 347 force_not_transparent_stack_level_(kNoLayer),
347 is_forced_not_solid_(false), 348 is_forced_not_solid_(false),
348 is_forced_not_transparent_(false), 349 is_forced_not_transparent_(false),
349 is_solid_color_(true), 350 is_solid_color_(true),
350 color_(SK_ColorTRANSPARENT), 351 color_(SK_ColorTRANSPARENT),
351 is_transparent_(true), 352 is_transparent_(true),
352 draw_op_count_(0) { 353 draw_op_count_(0),
354 rejected_op_count_(0) {
353 } 355 }
354 356
355 AnalysisCanvas::~AnalysisCanvas() {} 357 AnalysisCanvas::~AnalysisCanvas() {}
356 358
357 bool AnalysisCanvas::GetColorIfSolid(SkColor* color) const { 359 bool AnalysisCanvas::GetColorIfSolid(SkColor* color) const {
358 if (is_transparent_) { 360 if (is_transparent_) {
359 *color = SK_ColorTRANSPARENT; 361 *color = SK_ColorTRANSPARENT;
360 return true; 362 return true;
361 } 363 }
362 if (is_solid_color_) { 364 if (is_solid_color_) {
363 *color = color_; 365 *color = color_;
364 return true; 366 return true;
365 } 367 }
366 return false; 368 return false;
367 } 369 }
368 370
369 bool AnalysisCanvas::abort() { 371 bool AnalysisCanvas::abort() {
370 // Early out as soon as we have more than one draw op. 372 // Early out as soon as we have more than 1 draw op or 5 rejected ops.
371 // TODO(vmpstr): Investigate if 1 is the correct metric here. We need to 373 // TODO(vmpstr): Investigate if 1 and 5 are the correct metrics here. We need
372 // balance the amount of time we spend analyzing vs how many tiles would be 374 // to balance the amount of time we spend analyzing vs how many tiles would be
373 // solid if the number was higher. 375 // solid if the numbers were higher.
374 if (draw_op_count_ > 1) { 376 if (draw_op_count_ > 1 || rejected_op_count_ > 5) {
375 TRACE_EVENT0("disabled-by-default-skia", 377 TRACE_EVENT0("disabled-by-default-skia",
376 "AnalysisCanvas::abort() -- aborting"); 378 "AnalysisCanvas::abort() -- aborting");
377 // We have to reset solid/transparent state to false since we don't 379 // We have to reset solid/transparent state to false since we don't
378 // know whether consequent operations will make this false. 380 // know whether consequent operations will make this false.
379 is_solid_color_ = false; 381 is_solid_color_ = false;
380 is_transparent_ = false; 382 is_transparent_ = false;
381 return true; 383 return true;
382 } 384 }
383 return false; 385 return false;
384 } 386 }
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 force_not_transparent_stack_level_ = kNoLayer; 488 force_not_transparent_stack_level_ = kNoLayer;
487 } 489 }
488 } 490 }
489 491
490 INHERITED::willRestore(); 492 INHERITED::willRestore();
491 } 493 }
492 494
493 } // namespace skia 495 } // namespace skia
494 496
495 497
OLDNEW
« no previous file with comments | « skia/ext/analysis_canvas.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698