aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/core/SkPicture.h12
-rw-r--r--src/core/SkPicture.cpp47
2 files changed, 16 insertions, 43 deletions
diff --git a/include/core/SkPicture.h b/include/core/SkPicture.h
index 2d782a50c8..fba0a35939 100644
--- a/include/core/SkPicture.h
+++ b/include/core/SkPicture.h
@@ -292,13 +292,9 @@ private:
bool suitableForGpuRasterization(const char** reason, int sampleCount) const;
- bool fWillPlaybackBitmaps;
- bool fHasText;
- int fNumPaintWithPathEffectUses;
- int fNumFastPathDashEffects;
- int fNumAAConcavePaths;
- int fNumAAHairlineConcavePaths;
- int fNumAADFEligibleConcavePaths;
+ uint8_t fNumSlowPathsAndDashEffects;
+ bool fWillPlaybackBitmaps : 1;
+ bool fHasText : 1;
} fAnalysis;
friend class SkPictureRecorder; // SkRecord-based constructor.
@@ -307,6 +303,6 @@ private:
friend class SkPictureUtils;
friend class SkRecordedDrawable;
};
-SK_COMPILE_ASSERT(sizeof(SkPicture) <= 104, SkPictureSize);
+SK_COMPILE_ASSERT(sizeof(SkPicture) <= 88, SkPictureSize);
#endif
diff --git a/src/core/SkPicture.cpp b/src/core/SkPicture.cpp
index 37bf921666..4d4364aec6 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).";