/* * 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 "SkPicture.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 SkPicture::AccelData { public: // Information about a given saveLayer/restore block in an SkPicture class BlockInfo { public: BlockInfo() : fPicture(NULL), fPaint(NULL), fKey(NULL), fKeySize(0) {} ~BlockInfo() { SkSafeUnref(fPicture); SkDELETE(fPaint); SkDELETE_ARRAY(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 NULL. If it is a nested picture then the pointer // is non-NULL 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 NULL 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. unsigned* fKey; int fKeySize; // # of ints }; SkLayerInfo(Key key) : INHERITED(key) { } 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]; } // We may, in the future, need to pass in the GPUDevice in order to // incorporate the clip and matrix state into the key static SkPicture::AccelData::Key ComputeKey(); private: SkTArray<BlockInfo, true> fBlocks; typedef SkPicture::AccelData INHERITED; }; #endif // SkLayerInfo_DEFINED