/*
 * 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

#include "SkPaint.h"
#include "SkTDArray.h"

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;
    // This field is incremented every time a drawPath call is
    // issued for a concave path that can be rendered with distance fields
    int fNumAADFEligibleConcavePaths;
    // 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
