1 /* 2 * Copyright 2016 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "SkPath.h" 9 #include "SkPicture.h" 10 #include "SkPictureAnalyzer.h" 11 #include "SkPictureCommon.h" 12 #include "SkRecords.h" 13 14 #if SK_SUPPORT_GPU 15 16 namespace { 17 18 inline bool veto_predicate(uint32_t numSlowPaths) { 19 return numSlowPaths > 5; 20 } 21 22 } // anonymous namespace 23 24 SkPictureGpuAnalyzer::SkPictureGpuAnalyzer(sk_sp<GrContextThreadSafeProxy> /* unused ATM */) 25 : fNumSlowPaths(0) { } 26 27 SkPictureGpuAnalyzer::SkPictureGpuAnalyzer(const sk_sp<SkPicture>& picture, 28 sk_sp<GrContextThreadSafeProxy> ctx) 29 : SkPictureGpuAnalyzer(std::move(ctx)) { 30 this->analyzePicture(picture.get()); 31 } 32 33 void SkPictureGpuAnalyzer::analyzePicture(const SkPicture* picture) { 34 if (!picture) { 35 return; 36 } 37 38 fNumSlowPaths += picture->numSlowPaths(); 39 } 40 41 void SkPictureGpuAnalyzer::analyzeClipPath(const SkPath& path, SkClipOp op, bool doAntiAlias) { 42 const SkRecords::ClipPath clipOp = { 43 SkIRect::MakeEmpty(), // Willie don't care. 44 path, 45 SkRecords::ClipOpAndAA(op, doAntiAlias) 46 }; 47 48 SkPathCounter counter; 49 counter(clipOp); 50 fNumSlowPaths += counter.fNumSlowPathsAndDashEffects; 51 } 52 53 void SkPictureGpuAnalyzer::reset() { 54 fNumSlowPaths = 0; 55 } 56 57 bool SkPictureGpuAnalyzer::suitableForGpuRasterization(const char** whyNot) const { 58 if(veto_predicate(fNumSlowPaths)) { 59 if (whyNot) { *whyNot = "Too many slow paths (either concave or dashed)."; } 60 return false; 61 } 62 return true; 63 } 64 65 #endif // SK_SUPPORT_GPU 66