1/*
2 * Copyright 2014 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#ifndef SkPictureContentInfo_DEFINED
9#define SkPictureContentInfo_DEFINED
10
11#include "SkTDArray.h"
12
13class GrContext;
14
15class SkPictureContentInfo {
16public:
17    SkPictureContentInfo() { this->reset(); }
18    SkPictureContentInfo(const SkPictureContentInfo& src) { this->set(src); }
19
20    int numOperations() const { return fNumOperations; }
21    bool hasText() const { return fNumTexts > 0; }
22
23    int numLayers() const { return fNumLayers; }
24    int numInteriorLayers() const { return fNumInteriorLayers; }
25    int numLeafLayers() const { return fNumLeafLayers; }
26
27    bool suitableForGpuRasterization(GrContext* context, const char **reason,
28                                     int sampleCount) const;
29
30    void addOperation() { ++fNumOperations; }
31
32    void onDrawPoints(size_t count, const SkPaint& paint);
33    void onDrawPath(const SkPath& path, const SkPaint& paint);
34    void onAddPaintPtr(const SkPaint* paint);
35    void onDrawText() { ++fNumTexts; }
36
37    void onSaveLayer();
38    void onSave();
39    void onRestore();
40    void rescindLastSave();
41    void rescindLastSaveLayer();
42
43    void set(const SkPictureContentInfo& src);
44    void reset();
45    void swap(SkPictureContentInfo* other);
46
47private:
48    // Raw count of operations in the picture
49    int fNumOperations;
50    // Count of all forms of drawText
51    int fNumTexts;
52
53    // This field is incremented every time a paint with a path effect is
54    // used (i.e., it is not a de-duplicated count)
55    int fNumPaintWithPathEffectUses;
56    // This field is incremented every time a paint with a path effect that is
57    // dashed, we are drawing a line, and we can use the gpu fast path
58    int fNumFastPathDashEffects;
59    // This field is incremented every time an anti-aliased drawPath call is
60    // issued with a concave path
61    int fNumAAConcavePaths;
62    // This field is incremented every time a drawPath call is
63    // issued for a hairline stroked concave path.
64    int fNumAAHairlineConcavePaths;
65    // This field is incremented every time a drawPath call is
66    // issued for a concave path that can be rendered with distance fields
67    int fNumAADFEligibleConcavePaths;
68    // These fields track the different layer flavors. fNumLayers is just
69    // a count of all saveLayers, fNumInteriorLayers is the number of layers
70    // with a layer inside them, fNumLeafLayers is the number of layers with
71    // no layer inside them.
72    int fNumLayers;
73    int fNumInteriorLayers;
74    int fNumLeafLayers;
75
76    enum Flags {
77        kSave_Flag      = 0x1,
78        kSaveLayer_Flag = 0x2,
79
80        // Did the current save or saveLayer contain another saveLayer.
81        // Percolated back down the save stack.
82        kContainedSaveLayer_Flag = 0x4
83    };
84
85    // Stack of save vs saveLayer information to track nesting
86    SkTDArray<uint32_t> fSaveStack;
87};
88
89#endif
90