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