blob: 04ae1794a24fb808cc9b995364f08b7efb427682 [file] [log] [blame]
/*
* 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<BlockInfo, true> fBlocks;
typedef SkBigPicture::AccelData INHERITED;
};
#endif // SkLayerInfo_DEFINED