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