| Index: src/gpu/GrRecordReplaceDraw.h
|
| diff --git a/src/gpu/GrRecordReplaceDraw.h b/src/gpu/GrRecordReplaceDraw.h
|
| index 4900e0d2417ec7d34d3faf58866814b2a1929b27..cbf2624d31f0c79f07a2c45a6f1dc493d0a4892b 100644
|
| --- a/src/gpu/GrRecordReplaceDraw.h
|
| +++ b/src/gpu/GrRecordReplaceDraw.h
|
| @@ -8,9 +8,11 @@
|
| #ifndef GrRecordReplaceDraw_DEFINED
|
| #define GrRecordReplaceDraw_DEFINED
|
|
|
| +#include "SkChecksum.h"
|
| #include "SkDrawPictureCallback.h"
|
| +#include "SkImage.h"
|
| #include "SkRect.h"
|
| -#include "SkTDArray.h"
|
| +#include "SkTDynamicHash.h"
|
|
|
| class SkBBoxHierarchy;
|
| class SkBitmap;
|
| @@ -27,8 +29,52 @@ class GrReplacements {
|
| public:
|
| // All the operations between fStart and fStop (inclusive) will be replaced with
|
| // a single drawBitmap call using fPos, fBM and fPaint.
|
| - struct ReplacementInfo {
|
| - unsigned fStart;
|
| + class ReplacementInfo {
|
| + public:
|
| + struct Key {
|
| + Key(uint32_t pictureID, unsigned int start, const SkMatrix& ctm, bool foo)
|
| + : fPictureID(pictureID)
|
| + , fStart(start)
|
| + , fCTM(ctm) {
|
| + fCTM.getType(); // force initialization of type so hashes match
|
| +
|
| + // Key needs to be tightly packed.
|
| + GR_STATIC_ASSERT(sizeof(Key) == sizeof(uint32_t) + // picture ID
|
| + sizeof(int) + // start
|
| + 9 * sizeof(SkScalar) // 3x3 from CTM
|
| + +sizeof(uint32_t)); // matrix's type
|
| + }
|
| +
|
| + bool operator==(const Key& other) const {
|
| + return fPictureID == other.fPictureID &&
|
| + fStart == other.fStart &&
|
| + fCTM.cheapEqualTo(other.fCTM); // TODO: should be fuzzy
|
| + }
|
| +
|
| + uint32_t pictureID() const { return fPictureID; }
|
| + unsigned int start() const { return fStart; }
|
| +
|
| + private:
|
| + uint32_t fPictureID;
|
| + unsigned int fStart;
|
| + const SkMatrix fCTM;
|
| + };
|
| +
|
| + static const Key& GetKey(const ReplacementInfo& layer) { return layer.fKey; }
|
| + static uint32_t Hash(const Key& key) {
|
| + return SkChecksum::Murmur3(reinterpret_cast<const uint32_t*>(&key), sizeof(Key));
|
| + }
|
| +
|
| + ReplacementInfo(uint32_t pictureID, unsigned int start, const SkMatrix& ctm, bool foo)
|
| + : fKey(pictureID, start, ctm, foo)
|
| + , fImage(NULL)
|
| + , fPaint(NULL) {
|
| + }
|
| + ~ReplacementInfo() { fImage->unref(); SkDELETE(fPaint); }
|
| +
|
| + unsigned int start() const { return fKey.start(); }
|
| +
|
| + const Key fKey;
|
| unsigned fStop;
|
| SkIPoint fPos;
|
| SkImage* fImage; // Owns a ref
|
| @@ -39,25 +85,17 @@ public:
|
|
|
| ~GrReplacements() { this->freeAll(); }
|
|
|
| - // Add a new replacement range. The replacement ranges should be
|
| - // sorted in increasing order and non-overlapping (esp. no nested
|
| - // saveLayers).
|
| - ReplacementInfo* push();
|
| + // Add a new replacement range.
|
| + ReplacementInfo* newReplacement(uint32_t pictureID, unsigned int start, const SkMatrix& ctm);
|
|
|
| // look up a replacement range by its start offset.
|
| - // lastLookedUp is an in/out parameter that is used to speed up the search.
|
| - // It should be initialized to 0 on the first call and then passed back in
|
| - // unmodified on subsequent calls.
|
| - const ReplacementInfo* lookupByStart(size_t start, int* lastLookedUp) const;
|
| + // TODO: also need to add clip to lookup
|
| + const ReplacementInfo* lookupByStart(uint32_t pictureID, size_t start, const SkMatrix& ctm) const;
|
|
|
| private:
|
| - SkTDArray<ReplacementInfo> fReplacements;
|
| + SkTDynamicHash<ReplacementInfo, ReplacementInfo::Key> fReplacementHash;
|
|
|
| void freeAll();
|
| -
|
| -#ifdef SK_DEBUG
|
| - void validate() const;
|
| -#endif
|
| };
|
|
|
| // Draw an SkPicture into an SkCanvas replacing saveLayer/restore blocks with
|
| @@ -65,7 +103,7 @@ private:
|
| void GrRecordReplaceDraw(const SkPicture*,
|
| SkCanvas*,
|
| const GrReplacements*,
|
| - const SkMatrix&,
|
| + const SkMatrix& initialMatrix,
|
| SkDrawPictureCallback*);
|
|
|
| #endif // GrRecordReplaceDraw_DEFINED
|
|
|