1796e365999220f53acc58ba91ed55bb35900c8bcfmalita/* 2796e365999220f53acc58ba91ed55bb35900c8bcfmalita * Copyright 2016 Google Inc. 3796e365999220f53acc58ba91ed55bb35900c8bcfmalita * 4796e365999220f53acc58ba91ed55bb35900c8bcfmalita * Use of this source code is governed by a BSD-style license that can be 5796e365999220f53acc58ba91ed55bb35900c8bcfmalita * found in the LICENSE file. 6796e365999220f53acc58ba91ed55bb35900c8bcfmalita */ 7796e365999220f53acc58ba91ed55bb35900c8bcfmalita 8b5fc58e1de6c2428f786034262a2ecdc8388d21dfmalita#include "SkPath.h" 9796e365999220f53acc58ba91ed55bb35900c8bcfmalita#include "SkPicture.h" 10796e365999220f53acc58ba91ed55bb35900c8bcfmalita#include "SkPictureAnalyzer.h" 11b5fc58e1de6c2428f786034262a2ecdc8388d21dfmalita#include "SkPictureCommon.h" 12b5fc58e1de6c2428f786034262a2ecdc8388d21dfmalita#include "SkRecords.h" 13796e365999220f53acc58ba91ed55bb35900c8bcfmalita 14796e365999220f53acc58ba91ed55bb35900c8bcfmalita#if SK_SUPPORT_GPU 15796e365999220f53acc58ba91ed55bb35900c8bcfmalita 16796e365999220f53acc58ba91ed55bb35900c8bcfmalitanamespace { 17796e365999220f53acc58ba91ed55bb35900c8bcfmalita 18796e365999220f53acc58ba91ed55bb35900c8bcfmalitainline bool veto_predicate(uint32_t numSlowPaths) { 19796e365999220f53acc58ba91ed55bb35900c8bcfmalita return numSlowPaths > 5; 20796e365999220f53acc58ba91ed55bb35900c8bcfmalita} 21796e365999220f53acc58ba91ed55bb35900c8bcfmalita 22796e365999220f53acc58ba91ed55bb35900c8bcfmalita} // anonymous namespace 23796e365999220f53acc58ba91ed55bb35900c8bcfmalita 24796e365999220f53acc58ba91ed55bb35900c8bcfmalitaSkPictureGpuAnalyzer::SkPictureGpuAnalyzer(sk_sp<GrContextThreadSafeProxy> /* unused ATM */) 25796e365999220f53acc58ba91ed55bb35900c8bcfmalita : fNumSlowPaths(0) { } 26796e365999220f53acc58ba91ed55bb35900c8bcfmalita 27796e365999220f53acc58ba91ed55bb35900c8bcfmalitaSkPictureGpuAnalyzer::SkPictureGpuAnalyzer(const sk_sp<SkPicture>& picture, 28796e365999220f53acc58ba91ed55bb35900c8bcfmalita sk_sp<GrContextThreadSafeProxy> ctx) 29796e365999220f53acc58ba91ed55bb35900c8bcfmalita : SkPictureGpuAnalyzer(std::move(ctx)) { 30019db3fe885848913645e2dda62c84744ad5ee65fmalita this->analyzePicture(picture.get()); 31796e365999220f53acc58ba91ed55bb35900c8bcfmalita} 32796e365999220f53acc58ba91ed55bb35900c8bcfmalita 33b5fc58e1de6c2428f786034262a2ecdc8388d21dfmalitavoid SkPictureGpuAnalyzer::analyzePicture(const SkPicture* picture) { 34ea9767356385866263a3164dcc1fb9e1633f57efsenorblanco if (!picture) { 35796e365999220f53acc58ba91ed55bb35900c8bcfmalita return; 36796e365999220f53acc58ba91ed55bb35900c8bcfmalita } 37796e365999220f53acc58ba91ed55bb35900c8bcfmalita 38796e365999220f53acc58ba91ed55bb35900c8bcfmalita fNumSlowPaths += picture->numSlowPaths(); 39796e365999220f53acc58ba91ed55bb35900c8bcfmalita} 40796e365999220f53acc58ba91ed55bb35900c8bcfmalita 41c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reedvoid SkPictureGpuAnalyzer::analyzeClipPath(const SkPath& path, SkClipOp op, bool doAntiAlias) { 42b5fc58e1de6c2428f786034262a2ecdc8388d21dfmalita const SkRecords::ClipPath clipOp = { 43b5fc58e1de6c2428f786034262a2ecdc8388d21dfmalita SkIRect::MakeEmpty(), // Willie don't care. 44b5fc58e1de6c2428f786034262a2ecdc8388d21dfmalita path, 4573603f3c52ffd89fe9d035be827b566a0e7d3b79reed SkRecords::ClipOpAndAA(op, doAntiAlias) 46b5fc58e1de6c2428f786034262a2ecdc8388d21dfmalita }; 47b5fc58e1de6c2428f786034262a2ecdc8388d21dfmalita 48b5fc58e1de6c2428f786034262a2ecdc8388d21dfmalita SkPathCounter counter; 49b5fc58e1de6c2428f786034262a2ecdc8388d21dfmalita counter(clipOp); 50b5fc58e1de6c2428f786034262a2ecdc8388d21dfmalita fNumSlowPaths += counter.fNumSlowPathsAndDashEffects; 51b5fc58e1de6c2428f786034262a2ecdc8388d21dfmalita} 52b5fc58e1de6c2428f786034262a2ecdc8388d21dfmalita 53796e365999220f53acc58ba91ed55bb35900c8bcfmalitavoid SkPictureGpuAnalyzer::reset() { 54796e365999220f53acc58ba91ed55bb35900c8bcfmalita fNumSlowPaths = 0; 55796e365999220f53acc58ba91ed55bb35900c8bcfmalita} 56796e365999220f53acc58ba91ed55bb35900c8bcfmalita 57796e365999220f53acc58ba91ed55bb35900c8bcfmalitabool SkPictureGpuAnalyzer::suitableForGpuRasterization(const char** whyNot) const { 58796e365999220f53acc58ba91ed55bb35900c8bcfmalita if(veto_predicate(fNumSlowPaths)) { 59796e365999220f53acc58ba91ed55bb35900c8bcfmalita if (whyNot) { *whyNot = "Too many slow paths (either concave or dashed)."; } 60796e365999220f53acc58ba91ed55bb35900c8bcfmalita return false; 61796e365999220f53acc58ba91ed55bb35900c8bcfmalita } 62796e365999220f53acc58ba91ed55bb35900c8bcfmalita return true; 63796e365999220f53acc58ba91ed55bb35900c8bcfmalita} 64796e365999220f53acc58ba91ed55bb35900c8bcfmalita 65796e365999220f53acc58ba91ed55bb35900c8bcfmalita#endif // SK_SUPPORT_GPU 66