/*
 * Copyright 2014 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SkPictureContentInfo_DEFINED
#define SkPictureContentInfo_DEFINED

class GrContext;

class SkPictureContentInfo {
public:
    SkPictureContentInfo() { this->reset(); }
    SkPictureContentInfo(const SkPictureContentInfo& src) { this->set(src); }

    int numOperations() const { return fNumOperations; }
    bool hasText() const { return fNumTexts > 0; }

    int numLayers() const { return fNumLayers; }
    int numInteriorLayers() const { return fNumInteriorLayers; }
    int numLeafLayers() const { return fNumLeafLayers; }

    bool suitableForGpuRasterization(GrContext* context, const char **reason,
                                     int sampleCount) const;

    void addOperation() { ++fNumOperations; }

    void onDrawPoints(size_t count, const SkPaint& paint);
    void onDrawPath(const SkPath& path, const SkPaint& paint);
    void onAddPaintPtr(const SkPaint* paint);
    void onDrawText() { ++fNumTexts; }

    void onSaveLayer();
    void onSave();
    void onRestore();
    void rescindLastSave();
    void rescindLastSaveLayer();

    void set(const SkPictureContentInfo& src);
    void reset();
    void swap(SkPictureContentInfo* other);

private:
    // Raw count of operations in the picture
    int fNumOperations;
    // Count of all forms of drawText
    int fNumTexts;

    // This field is incremented every time a paint with a path effect is
    // used (i.e., it is not a de-duplicated count)
    int fNumPaintWithPathEffectUses;
    // This field is incremented every time a paint with a path effect that is
    // dashed, we are drawing a line, and we can use the gpu fast path
    int fNumFastPathDashEffects;
    // This field is incremented every time an anti-aliased drawPath call is
    // issued with a concave path
    int fNumAAConcavePaths;
    // This field is incremented every time a drawPath call is
    // issued for a hairline stroked concave path.
    int fNumAAHairlineConcavePaths;
    // These fields track the different layer flavors. fNumLayers is just
    // a count of all saveLayers, fNumInteriorLayers is the number of layers
    // with a layer inside them, fNumLeafLayers is the number of layers with
    // no layer inside them.
    int fNumLayers;
    int fNumInteriorLayers;
    int fNumLeafLayers;

    enum Flags {
        kSave_Flag      = 0x1,
        kSaveLayer_Flag = 0x2,

        // Did the current save or saveLayer contain another saveLayer.
        // Percolated back down the save stack.
        kContainedSaveLayer_Flag = 0x4
    };

    // Stack of save vs saveLayer information to track nesting
    SkTDArray<uint32_t> fSaveStack;
};

#endif
