| /* |
| * Copyright 2016 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "SkPath.h" |
| #include "SkPicture.h" |
| #include "SkPictureAnalyzer.h" |
| #include "SkPictureCommon.h" |
| #include "SkRecords.h" |
| |
| #if SK_SUPPORT_GPU |
| |
| namespace { |
| |
| inline bool veto_predicate(uint32_t numSlowPaths) { |
| return numSlowPaths > 5; |
| } |
| |
| } // anonymous namespace |
| |
| SkPictureGpuAnalyzer::SkPictureGpuAnalyzer(sk_sp<GrContextThreadSafeProxy> /* unused ATM */) |
| : fNumSlowPaths(0) { } |
| |
| SkPictureGpuAnalyzer::SkPictureGpuAnalyzer(const sk_sp<SkPicture>& picture, |
| sk_sp<GrContextThreadSafeProxy> ctx) |
| : SkPictureGpuAnalyzer(std::move(ctx)) { |
| this->analyzePicture(picture.get()); |
| } |
| |
| void SkPictureGpuAnalyzer::analyzePicture(const SkPicture* picture) { |
| if (!picture) { |
| return; |
| } |
| |
| fNumSlowPaths += picture->numSlowPaths(); |
| } |
| |
| void SkPictureGpuAnalyzer::analyzeClipPath(const SkPath& path, SkClipOp op, bool doAntiAlias) { |
| const SkRecords::ClipPath clipOp = { |
| SkIRect::MakeEmpty(), // Willie don't care. |
| path, |
| SkRecords::ClipOpAndAA(op, doAntiAlias) |
| }; |
| |
| SkPathCounter counter; |
| counter(clipOp); |
| fNumSlowPaths += counter.fNumSlowPathsAndDashEffects; |
| } |
| |
| void SkPictureGpuAnalyzer::reset() { |
| fNumSlowPaths = 0; |
| } |
| |
| bool SkPictureGpuAnalyzer::suitableForGpuRasterization(const char** whyNot) const { |
| if(veto_predicate(fNumSlowPaths)) { |
| if (whyNot) { *whyNot = "Too many slow paths (either concave or dashed)."; } |
| return false; |
| } |
| return true; |
| } |
| |
| #endif // SK_SUPPORT_GPU |