| Index: src/core/SkPictureReplacementPlayback.h
|
| diff --git a/src/core/SkPictureReplacementPlayback.h b/src/core/SkPictureReplacementPlayback.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..166a3bfbd350b326925e27380d6573b13a2af393
|
| --- /dev/null
|
| +++ b/src/core/SkPictureReplacementPlayback.h
|
| @@ -0,0 +1,86 @@
|
| +/*
|
| + * 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 SkPictureReplacementPlayback_DEFINED
|
| +#define SkPictureReplacementPlayback_DEFINED
|
| +
|
| +#include "SkPicturePlayback.h"
|
| +
|
| +// This playback class replaces complete "saveLayer ... restore" runs with a
|
| +// single drawBitmap call.
|
| +class SkPictureReplacementPlayback : public SkPicturePlayback {
|
| +public:
|
| + // PlaybackReplacements collects op ranges that can be replaced with
|
| + // a single drawBitmap call (using a precomputed bitmap).
|
| + class PlaybackReplacements {
|
| + public:
|
| + // All the operations between fStart and fStop (inclusive) will be replaced with
|
| + // a single drawBitmap call using fPos, fBM and fPaint.
|
| + // fPaint will be NULL if the picture's paint wasn't copyable
|
| + struct ReplacementInfo {
|
| + size_t fStart;
|
| + size_t fStop;
|
| + SkIPoint fPos;
|
| + SkBitmap* fBM; // fBM is allocated so ReplacementInfo can remain POD
|
| + const SkPaint* fPaint; // Note: this object doesn't own the paint
|
| +
|
| + SkIRect fSrcRect;
|
| + };
|
| +
|
| + ~PlaybackReplacements() { 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();
|
| +
|
| + // look up a replacement range by its start offset
|
| + ReplacementInfo* lookupByStart(size_t start);
|
| +
|
| + private:
|
| + SkTDArray<ReplacementInfo> fReplacements;
|
| +
|
| + void freeAll();
|
| +
|
| +#ifdef SK_DEBUG
|
| + void validate() const;
|
| +#endif
|
| + };
|
| +
|
| + // This class doesn't take ownership of either 'replacements' or 'activeOpsList'
|
| + // The caller must guarantee they exist across any calls to 'draw'.
|
| + // 'activeOpsList' can be NULL but in that case BBH acceleration will not
|
| + // be used ('replacements' can be NULL too but that defeats the purpose
|
| + // of using this class).
|
| + SkPictureReplacementPlayback(const SkPicture* picture,
|
| + PlaybackReplacements* replacements,
|
| + const SkPicture::OperationList* activeOpsList)
|
| + : INHERITED(picture)
|
| + , fReplacements(replacements)
|
| + , fActiveOpsList(activeOpsList) {
|
| + }
|
| +
|
| + virtual void draw(SkCanvas* canvas, SkDrawPictureCallback*) SK_OVERRIDE;
|
| +
|
| +private:
|
| + PlaybackReplacements* fReplacements;
|
| + const SkPicture::OperationList* fActiveOpsList;
|
| +
|
| + // This method checks if the current op pointed at by 'iter' and 'reader'
|
| + // is within a replacement range. If so, it issues the drawBitmap call,
|
| + // updates 'iter' and 'reader' to be after the restore operation, and
|
| + // returns true. If the operation is not in a replacement range (and thus
|
| + // needs to be drawn normally) false is returned.
|
| + bool replaceOps(SkPictureStateTree::Iterator* iter,
|
| + SkReader32* reader,
|
| + SkCanvas* canvas,
|
| + const SkMatrix& initialMatrix);
|
| +
|
| + typedef SkPicturePlayback INHERITED;
|
| +};
|
| +
|
| +#endif
|
|
|