|  | /* | 
|  | * 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 |