Index: src/gpu/GrRecordReplaceDraw.cpp |
diff --git a/src/gpu/GrRecordReplaceDraw.cpp b/src/gpu/GrRecordReplaceDraw.cpp |
index 3701dda36e978f4bedd8827095255b1296709463..852c51f4180dd155d9ad1c527d0ed9dc4111c960 100644 |
--- a/src/gpu/GrRecordReplaceDraw.cpp |
+++ b/src/gpu/GrRecordReplaceDraw.cpp |
@@ -5,50 +5,34 @@ |
* found in the LICENSE file. |
*/ |
+#include "GrContext.h" |
+#include "GrLayerCache.h" |
#include "GrRecordReplaceDraw.h" |
#include "SkCanvasPriv.h" |
+#include "SkGrPixelRef.h" |
#include "SkImage.h" |
#include "SkRecordDraw.h" |
#include "SkRecords.h" |
-GrReplacements::ReplacementInfo* GrReplacements::newReplacement(uint32_t pictureID, |
- const SkMatrix& initialMat, |
- const int* key, int keySize) { |
- ReplacementInfo* replacement = SkNEW_ARGS(ReplacementInfo, (pictureID, initialMat, |
- key, keySize)); |
- fReplacementHash.add(replacement); |
- return replacement; |
+static inline void wrap_texture(GrTexture* texture, int width, int height, SkBitmap* result) { |
+ SkImageInfo info = SkImageInfo::MakeN32Premul(width, height); |
+ result->setInfo(info); |
+ result->setPixelRef(SkNEW_ARGS(SkGrPixelRef, (info, texture)))->unref(); |
} |
-void GrReplacements::freeAll() { |
- SkTDynamicHash<ReplacementInfo, ReplacementInfo::Key>::Iter iter(&fReplacementHash); |
+static inline void draw_replacement_bitmap(GrCachedLayer* layer, SkCanvas* canvas) { |
+ const SkRect src = SkRect::Make(layer->rect()); |
+ const SkRect dst = SkRect::Make(layer->bound()); |
- for (; !iter.done(); ++iter) { |
- ReplacementInfo* replacement = &(*iter); |
- SkDELETE(replacement); |
- } |
- |
- fReplacementHash.reset(); |
-} |
- |
-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, |
- SkCanvas* canvas) { |
- SkRect src = SkRect::Make(ri->fSrcRect); |
- SkRect dst = SkRect::MakeXYWH(SkIntToScalar(ri->fPos.fX), |
- SkIntToScalar(ri->fPos.fY), |
- SkIntToScalar(ri->fSrcRect.width()), |
- SkIntToScalar(ri->fSrcRect.height())); |
+ SkBitmap bm; |
+ wrap_texture(layer->texture(), |
+ !layer->isAtlased() ? layer->rect().width() : layer->texture()->width(), |
+ !layer->isAtlased() ? layer->rect().height() : layer->texture()->height(), |
+ &bm); |
canvas->save(); |
canvas->setMatrix(SkMatrix::I()); |
- canvas->drawImageRect(ri->fImage, &src, dst, ri->fPaint); |
+ canvas->drawBitmapRectToRect(bm, &src, dst, layer->paint()); |
canvas->restore(); |
} |
@@ -56,19 +40,18 @@ static inline void draw_replacement_bitmap(const GrReplacements::ReplacementInfo |
// also draws them with replaced layers. |
class ReplaceDraw : public SkRecords::Draw { |
public: |
- ReplaceDraw(SkCanvas* canvas, |
+ ReplaceDraw(SkCanvas* canvas, GrLayerCache* layerCache, |
SkPicture const* const drawablePicts[], int drawableCount, |
const SkPicture* topLevelPicture, |
const SkPicture* picture, |
- const GrReplacements* replacements, |
const SkMatrix& initialMatrix, |
SkDrawPictureCallback* callback, |
- const int* opIndices, int numIndices) |
+ const unsigned* opIndices, int numIndices) |
: INHERITED(canvas, drawablePicts, NULL, drawableCount) |
, fCanvas(canvas) |
+ , fLayerCache(layerCache) |
, fTopLevelPicture(topLevelPicture) |
, fPicture(picture) |
- , fReplacements(replacements) |
, fInitialMatrix(initialMatrix) |
, fCallback(callback) |
, fIndex(0) |
@@ -137,8 +120,9 @@ public: |
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(), |
- fTopLevelPicture, dp.picture, fReplacements, fInitialMatrix, fCallback, |
+ ReplaceDraw draw(fCanvas, fLayerCache, |
+ this->drawablePicts(), this->drawableCount(), |
+ fTopLevelPicture, dp.picture, fInitialMatrix, fCallback, |
fOpIndexStack.begin(), fOpIndexStack.count()); |
fNumReplaced += draw.draw(); |
@@ -158,23 +142,23 @@ public: |
fOpIndexStack.push(startOffset); |
- const GrReplacements::ReplacementInfo* ri = fReplacements->lookup( |
- fTopLevelPicture->uniqueID(), |
- fInitialMatrix, |
- fOpIndexStack.begin(), |
- fOpIndexStack.count()); |
+ GrCachedLayer* layer = fLayerCache->findLayer(fTopLevelPicture->uniqueID(), |
+ fInitialMatrix, |
+ fOpIndexStack.begin(), |
+ fOpIndexStack.count()); |
- if (ri) { |
+ if (layer) { |
fNumReplaced++; |
- draw_replacement_bitmap(ri, fCanvas); |
+ |
+ draw_replacement_bitmap(layer, fCanvas); |
if (fPicture->fBBH.get()) { |
- while (fOps[fIndex] < ri->fStop) { |
+ while (fOps[fIndex] < layer->stop()) { |
++fIndex; |
} |
- SkASSERT(fOps[fIndex] == ri->fStop); |
+ SkASSERT(fOps[fIndex] == layer->stop()); |
} else { |
- fIndex = ri->fStop; |
+ fIndex = layer->stop(); |
} |
fOpIndexStack.pop(); |
return; |
@@ -188,9 +172,9 @@ public: |
private: |
SkCanvas* fCanvas; |
+ GrLayerCache* fLayerCache; |
const SkPicture* fTopLevelPicture; |
const SkPicture* fPicture; |
- const GrReplacements* fReplacements; |
const SkMatrix fInitialMatrix; |
SkDrawPictureCallback* fCallback; |
@@ -199,22 +183,21 @@ private: |
int fNumReplaced; |
// The op code indices of all the enclosing drawPicture and saveLayer calls |
- SkTDArray<int> fOpIndexStack; |
+ SkTDArray<unsigned> fOpIndexStack; |
typedef Draw INHERITED; |
}; |
int GrRecordReplaceDraw(const SkPicture* picture, |
SkCanvas* canvas, |
- const GrReplacements* replacements, |
+ GrLayerCache* layerCache, |
const SkMatrix& initialMatrix, |
SkDrawPictureCallback* callback) { |
SkAutoCanvasRestore saveRestore(canvas, true /*save now, restore at exit*/); |
// TODO: drawablePicts? |
- ReplaceDraw draw(canvas, NULL, 0, |
+ ReplaceDraw draw(canvas, layerCache, NULL, 0, |
picture, picture, |
- replacements, initialMatrix, callback, NULL, 0); |
- |
+ initialMatrix, callback, NULL, 0); |
return draw.draw(); |
} |