diff options
-rw-r--r-- | include/core/SkPicture.h | 12 | ||||
-rw-r--r-- | src/core/SkPicture.cpp | 47 |
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)."; |