| Index: src/gpu/GrRecordReplaceDraw.cpp
|
| diff --git a/src/gpu/GrRecordReplaceDraw.cpp b/src/gpu/GrRecordReplaceDraw.cpp
|
| index dd686d33b98e8d38305c639ec6d86b307ab73e56..9748f13701d5b1bb0c18efb234e3e7d3fd95f4f6 100644
|
| --- a/src/gpu/GrRecordReplaceDraw.cpp
|
| +++ b/src/gpu/GrRecordReplaceDraw.cpp
|
| @@ -12,9 +12,10 @@
|
| #include "SkRecords.h"
|
|
|
| GrReplacements::ReplacementInfo* GrReplacements::newReplacement(uint32_t pictureID,
|
| - unsigned start,
|
| - const SkMatrix& ctm) {
|
| - ReplacementInfo* replacement = SkNEW_ARGS(ReplacementInfo, (pictureID, start, ctm));
|
| + const SkMatrix& initialMat,
|
| + const int* key, int keySize) {
|
| + ReplacementInfo* replacement = SkNEW_ARGS(ReplacementInfo, (pictureID, initialMat,
|
| + key, keySize));
|
| fReplacementHash.add(replacement);
|
| return replacement;
|
| }
|
| @@ -30,10 +31,11 @@ void GrReplacements::freeAll() {
|
| fReplacementHash.reset();
|
| }
|
|
|
| -const GrReplacements::ReplacementInfo* GrReplacements::lookupByStart(uint32_t pictureID,
|
| - unsigned start,
|
| - const SkMatrix& ctm) const {
|
| - return fReplacementHash.find(ReplacementInfo::Key(pictureID, start, ctm));
|
| +const GrReplacements::ReplacementInfo* GrReplacements::lookup(uint32_t pictureID,
|
| + const SkMatrix& initialMat,
|
| + const int* key,
|
| + int keySize) const {
|
| + return fReplacementHash.find(ReplacementInfo::Key(pictureID, initialMat, key, keySize));
|
| }
|
|
|
| static inline void draw_replacement_bitmap(const GrReplacements::ReplacementInfo* ri,
|
| @@ -56,18 +58,22 @@ class ReplaceDraw : public SkRecords::Draw {
|
| public:
|
| ReplaceDraw(SkCanvas* canvas,
|
| SkPicture const* const drawablePicts[], int drawableCount,
|
| + const SkPicture* topLevelPicture,
|
| const SkPicture* picture,
|
| const GrReplacements* replacements,
|
| const SkMatrix& initialMatrix,
|
| - SkDrawPictureCallback* callback)
|
| + SkDrawPictureCallback* callback,
|
| + const int* opIndices, int numIndices)
|
| : INHERITED(canvas, drawablePicts, NULL, drawableCount)
|
| , fCanvas(canvas)
|
| + , fTopLevelPicture(topLevelPicture)
|
| , fPicture(picture)
|
| , fReplacements(replacements)
|
| , fInitialMatrix(initialMatrix)
|
| , fCallback(callback)
|
| , fIndex(0)
|
| , fNumReplaced(0) {
|
| + fOpIndexStack.append(numIndices, opIndices);
|
| }
|
|
|
| int draw() {
|
| @@ -118,13 +124,26 @@ public:
|
| this->INHERITED::operator()(r);
|
| }
|
| void operator()(const SkRecords::DrawPicture& dp) {
|
| +
|
| + int drawPictureOffset;
|
| + if (fOps.count()) {
|
| + drawPictureOffset = fOps[fIndex];
|
| + } else {
|
| + drawPictureOffset = fIndex;
|
| + }
|
| +
|
| + fOpIndexStack.push(drawPictureOffset);
|
| +
|
| SkAutoCanvasMatrixPaint acmp(fCanvas, dp.matrix, dp.paint, dp.picture->cullRect());
|
|
|
| // Draw sub-pictures with the same replacement list but a different picture
|
| ReplaceDraw draw(fCanvas, this->drawablePicts(), this->drawableCount(),
|
| - dp.picture, fReplacements, fInitialMatrix, fCallback);
|
| + fTopLevelPicture, dp.picture, fReplacements, fInitialMatrix, fCallback,
|
| + fOpIndexStack.begin(), fOpIndexStack.count());
|
|
|
| fNumReplaced += draw.draw();
|
| +
|
| + fOpIndexStack.pop();
|
| }
|
| void operator()(const SkRecords::SaveLayer& sl) {
|
|
|
| @@ -137,11 +156,13 @@ public:
|
| startOffset = fIndex;
|
| }
|
|
|
| - const SkMatrix& ctm = fCanvas->getTotalMatrix();
|
| - const GrReplacements::ReplacementInfo* ri = fReplacements->lookupByStart(
|
| - fPicture->uniqueID(),
|
| - startOffset,
|
| - ctm);
|
| + fOpIndexStack.push(startOffset);
|
| +
|
| + const GrReplacements::ReplacementInfo* ri = fReplacements->lookup(
|
| + fTopLevelPicture->uniqueID(),
|
| + fInitialMatrix,
|
| + fOpIndexStack.begin(),
|
| + fOpIndexStack.count());
|
|
|
| if (ri) {
|
| fNumReplaced++;
|
| @@ -155,15 +176,19 @@ public:
|
| } else {
|
| fIndex = ri->fStop;
|
| }
|
| + fOpIndexStack.pop();
|
| return;
|
| }
|
|
|
| // This is a fail for layer hoisting
|
| this->INHERITED::operator()(sl);
|
| +
|
| + fOpIndexStack.pop();
|
| }
|
|
|
| private:
|
| SkCanvas* fCanvas;
|
| + const SkPicture* fTopLevelPicture;
|
| const SkPicture* fPicture;
|
| const GrReplacements* fReplacements;
|
| const SkMatrix fInitialMatrix;
|
| @@ -173,6 +198,9 @@ private:
|
| int fIndex;
|
| int fNumReplaced;
|
|
|
| + // The op code indices of all the enclosing drawPicture and saveLayer calls
|
| + SkTDArray<int> fOpIndexStack;
|
| +
|
| typedef Draw INHERITED;
|
| };
|
|
|
| @@ -184,7 +212,9 @@ int GrRecordReplaceDraw(const SkPicture* picture,
|
| SkAutoCanvasRestore saveRestore(canvas, true /*save now, restore at exit*/);
|
|
|
| // TODO: drawablePicts?
|
| - ReplaceDraw draw(canvas, NULL, 0, picture, replacements, initialMatrix, callback);
|
| + ReplaceDraw draw(canvas, NULL, 0,
|
| + picture, picture,
|
| + replacements, initialMatrix, callback, NULL, 0);
|
|
|
| return draw.draw();
|
| }
|
|
|