diff options
author | 2015-04-27 07:55:33 -0700 | |
---|---|---|
committer | 2015-04-27 07:55:34 -0700 | |
commit | de8667b81f2fed2fbecba68e751756a48df5e0dd (patch) | |
tree | 359c0bb38d135a3cb733bff8b5d2ab14352c6084 /src | |
parent | 7831a4bbb46a919316efc7c70808dcaaf8ee629a (diff) |
Reduce sizeof(SkPicture::Analysis) from 24 bytes to 2 bytes.
This saves "up to" 22 bytes per SkPicture.
Due to alignment, this reduces sizeof(SkPicture):
- from 88 to 72 bytes on Linux x64
- from 68 to 48 bytes on Android
(with Chrome's build settings)
It also somewhat simplifies the GPU veto logic.
BUG=skia:
[mtklein] No public API changes.
TBR=reed@google.com
Review URL: https://codereview.chromium.org/1060863004
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkPicture.cpp | 47 |
1 files changed, 12 insertions, 35 deletions
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)."; |