Index: src/core/SkPicture.cpp |
diff --git a/src/core/SkPicture.cpp b/src/core/SkPicture.cpp |
index 37bf921666c4842a1711309e2975b1772b17aaf2..4d4364aec6988d641b17c9d714d7ad65d35e4228 100644 |
--- a/src/core/SkPicture.cpp |
+++ b/src/core/SkPicture.cpp |
@@ -133,27 +133,18 @@ struct TextHunter { |
struct SkPicture::PathCounter { |
SK_CREATE_MEMBER_DETECTOR(paint); |
- PathCounter() |
- : numPaintWithPathEffectUses (0) |
- , numFastPathDashEffects (0) |
- , numAAConcavePaths (0) |
- , numAAHairlineConcavePaths (0) |
- , numAADFEligibleConcavePaths(0) { |
- } |
+ PathCounter() : fNumSlowPathsAndDashEffects(0) {} |
// Recurse into nested pictures. |
void operator()(const SkRecords::DrawPicture& op) { |
const SkPicture::Analysis& analysis = op.picture->fAnalysis; |
- numPaintWithPathEffectUses += analysis.fNumPaintWithPathEffectUses; |
- numFastPathDashEffects += analysis.fNumFastPathDashEffects; |
- numAAConcavePaths += analysis.fNumAAConcavePaths; |
- numAAHairlineConcavePaths += analysis.fNumAAHairlineConcavePaths; |
- numAADFEligibleConcavePaths += analysis.fNumAADFEligibleConcavePaths; |
+ fNumSlowPathsAndDashEffects += analysis.fNumSlowPathsAndDashEffects; |
} |
void checkPaint(const SkPaint* paint) { |
if (paint && paint->getPathEffect()) { |
- numPaintWithPathEffectUses++; |
+ // Initially assume it's slow. |
+ fNumSlowPathsAndDashEffects++; |
} |
} |
@@ -165,7 +156,7 @@ struct SkPicture::PathCounter { |
SkPathEffect::DashType dashType = effect->asADash(&info); |
if (2 == op.count && SkPaint::kRound_Cap != op.paint.getStrokeCap() && |
SkPathEffect::kDash_DashType == dashType && 2 == info.fCount) { |
- numFastPathDashEffects++; |
+ fNumSlowPathsAndDashEffects--; |
} |
} |
} |
@@ -173,16 +164,16 @@ struct SkPicture::PathCounter { |
void operator()(const SkRecords::DrawPath& op) { |
this->checkPaint(&op.paint); |
if (op.paint.isAntiAlias() && !op.path.isConvex()) { |
- numAAConcavePaths++; |
- |
SkPaint::Style paintStyle = op.paint.getStyle(); |
const SkRect& pathBounds = op.path.getBounds(); |
if (SkPaint::kStroke_Style == paintStyle && |
0 == op.paint.getStrokeWidth()) { |
- numAAHairlineConcavePaths++; |
+ // AA hairline concave path is not slow. |
} else if (SkPaint::kFill_Style == paintStyle && pathBounds.width() < 64.f && |
pathBounds.height() < 64.f && !op.path.isVolatile()) { |
- numAADFEligibleConcavePaths++; |
+ // AADF eligible concave path is not slow. |
+ } else { |
+ fNumSlowPathsAndDashEffects++; |
} |
} |
} |
@@ -195,11 +186,7 @@ struct SkPicture::PathCounter { |
template <typename T> |
SK_WHEN(!HasMember_paint<T>, void) operator()(const T& op) { /* do nothing */ } |
- int numPaintWithPathEffectUses; |
- int numFastPathDashEffects; |
- int numAAConcavePaths; |
- int numAAHairlineConcavePaths; |
- int numAADFEligibleConcavePaths; |
+ int fNumSlowPathsAndDashEffects; |
}; |
SkPicture::Analysis::Analysis(const SkRecord& record) { |
@@ -209,11 +196,7 @@ SkPicture::Analysis::Analysis(const SkRecord& record) { |
for (unsigned i = 0; i < record.count(); i++) { |
record.visit<void>(i, counter); |
} |
- fNumPaintWithPathEffectUses = counter.numPaintWithPathEffectUses; |
- fNumFastPathDashEffects = counter.numFastPathDashEffects; |
- fNumAAConcavePaths = counter.numAAConcavePaths; |
- fNumAAHairlineConcavePaths = counter.numAAHairlineConcavePaths; |
- fNumAADFEligibleConcavePaths = counter.numAADFEligibleConcavePaths; |
+ fNumSlowPathsAndDashEffects = SkTMin<int>(counter.fNumSlowPathsAndDashEffects, 255); |
fHasText = false; |
TextHunter text; |
@@ -230,13 +213,7 @@ bool SkPicture::Analysis::suitableForGpuRasterization(const char** reason, |
// TODO: the heuristic used here needs to be refined |
static const int kNumSlowPathsTol = 6; |
- int numSlowPathDashedPaths = fNumPaintWithPathEffectUses - fNumFastPathDashEffects; |
- |
- int numSlowPaths = fNumAAConcavePaths - |
- fNumAAHairlineConcavePaths - |
- fNumAADFEligibleConcavePaths; |
- |
- bool ret = numSlowPathDashedPaths + numSlowPaths < kNumSlowPathsTol; |
+ bool ret = fNumSlowPathsAndDashEffects < kNumSlowPathsTol; |
if (!ret && reason) { |
*reason = "Too many slow paths (either concave or dashed)."; |