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