Home | History | Annotate | Download | only in core
      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 
     13 class GrContext;
     14 
     15 class SkPictureContentInfo {
     16 public:
     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 
     47 private:
     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