/* * 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 SkLayerInfo_DEFINED #define SkLayerInfo_DEFINED #include "SkBigPicture.h" #include "SkTArray.h" // This class stores information about the saveLayer/restore pairs found // within an SkPicture. It is used by Ganesh to perform layer hoisting. class SkLayerInfo : public SkBigPicture::AccelData { public: // Information about a given saveLayer/restore block in an SkPicture class BlockInfo { public: BlockInfo() : fPicture(nullptr), fPaint(nullptr), fKey(nullptr), fKeySize(0) {} ~BlockInfo() { SkSafeUnref(fPicture); delete fPaint; delete[] fKey; } // The picture owning the layer. If the owning picture is the top-most // one (i.e., the picture for which this SkLayerInfo was created) then // this pointer is nullptr. If it is a nested picture then the pointer // is non-nullptr and owns a ref on the picture. const SkPicture* fPicture; // The device space bounds of this layer. SkRect fBounds; // If not-empty, the optional bounds parameter passed in to the saveLayer // call. SkRect fSrcBounds; // The pre-matrix begins as the identity and accumulates the transforms // of the containing SkPictures (if any). This matrix state has to be // part of the initial matrix during replay so that it will be // preserved across setMatrix calls. SkMatrix fPreMat; // The matrix state (in the leaf picture) in which this layer's draws // must occur. It will/can be overridden by setMatrix calls in the // layer itself. It does not include the translation needed to map the // layer's top-left point to the origin (which must be part of the // initial matrix). SkMatrix fLocalMat; // The paint to use on restore. Can be nullptr since it is optional. const SkPaint* fPaint; // The index of this saveLayer in the picture. size_t fSaveLayerOpID; // The index of the matching restore in the picture. size_t fRestoreOpID; // True if this saveLayer has at least one other saveLayer nested within it. // False otherwise. bool fHasNestedLayers; // True if this saveLayer is nested within another. False otherwise. bool fIsNested; // The variable length key for this saveLayer block. It stores the // thread of drawPicture and saveLayer operation indices that lead to this // saveLayer (including its own op index). The BlockInfo owns this memory. int* fKey; int fKeySize; // # of ints }; SkLayerInfo() {} BlockInfo& addBlock() { return fBlocks.push_back(); } int numBlocks() const { return fBlocks.count(); } const BlockInfo& block(int index) const { SkASSERT(index < fBlocks.count()); return fBlocks[index]; } private: SkTArray fBlocks; typedef SkBigPicture::AccelData INHERITED; }; #endif // SkLayerInfo_DEFINED