Index: src/core/SkPictureRecord.cpp |
=================================================================== |
--- src/core/SkPictureRecord.cpp (revision 13686) |
+++ src/core/SkPictureRecord.cpp (working copy) |
@@ -11,6 +11,7 @@ |
#include "SkRRect.h" |
#include "SkBBoxHierarchy.h" |
#include "SkDevice.h" |
+#include "SkOffsetTable.h" |
#include "SkPictureStateTree.h" |
#include "SkSurface.h" |
@@ -44,6 +45,7 @@ |
fBitmapHeap = SkNEW(SkBitmapHeap); |
fFlattenableHeap.setBitmapStorage(fBitmapHeap); |
fPathHeap = NULL; // lazy allocate |
+ |
#ifndef SK_COLLAPSE_MATRIX_CLIP_STATE |
fFirstSavedLayerIndex = kNoSavedLayerIndex; |
#endif |
@@ -1125,10 +1127,11 @@ |
size_t initialOffset = this->addDraw(DRAW_BITMAP, &size); |
SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP, size) == fWriter.bytesWritten()); |
this->addPaintPtr(paint); |
- this->addBitmap(bitmap); |
+ int bitmapID = this->addBitmap(bitmap); |
this->addScalar(left); |
this->addScalar(top); |
this->validate(initialOffset, size); |
+ this->trackBitmapUse(bitmapID, initialOffset); |
} |
void SkPictureRecord::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src, |
@@ -1152,11 +1155,12 @@ |
SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_RECT_TO_RECT, size) |
== fWriter.bytesWritten()); |
this->addPaintPtr(paint); |
- this->addBitmap(bitmap); |
+ int bitmapID = this->addBitmap(bitmap); |
this->addRectPtr(src); // may be null |
this->addRect(dst); |
this->addInt(flags); |
this->validate(initialOffset, size); |
+ this->trackBitmapUse(bitmapID, initialOffset); |
} |
void SkPictureRecord::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& matrix, |
@@ -1174,9 +1178,10 @@ |
size_t initialOffset = this->addDraw(DRAW_BITMAP_MATRIX, &size); |
SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_MATRIX, size) == fWriter.bytesWritten()); |
this->addPaintPtr(paint); |
- this->addBitmap(bitmap); |
+ int bitmapID = this->addBitmap(bitmap); |
this->addMatrix(matrix); |
this->validate(initialOffset, size); |
+ this->trackBitmapUse(bitmapID, initialOffset); |
} |
void SkPictureRecord::drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, |
@@ -1194,10 +1199,11 @@ |
size_t initialOffset = this->addDraw(DRAW_BITMAP_NINE, &size); |
SkASSERT(initialOffset+getPaintOffset(DRAW_BITMAP_NINE, size) == fWriter.bytesWritten()); |
this->addPaintPtr(paint); |
- this->addBitmap(bitmap); |
+ int bitmapID = this->addBitmap(bitmap); |
this->addIRect(center); |
this->addRect(dst); |
this->validate(initialOffset, size); |
+ this->trackBitmapUse(bitmapID, initialOffset); |
} |
void SkPictureRecord::drawSprite(const SkBitmap& bitmap, int left, int top, |
@@ -1215,10 +1221,11 @@ |
size_t initialOffset = this->addDraw(DRAW_SPRITE, &size); |
SkASSERT(initialOffset+getPaintOffset(DRAW_SPRITE, size) == fWriter.bytesWritten()); |
this->addPaintPtr(paint); |
- this->addBitmap(bitmap); |
+ int bitmapID = this->addBitmap(bitmap); |
this->addInt(left); |
this->addInt(top); |
this->validate(initialOffset, size); |
+ this->trackBitmapUse(bitmapID, initialOffset); |
} |
void SkPictureRecord::ComputeFontMetricsTopBottom(const SkPaint& paint, SkScalar topbot[2]) { |
@@ -1612,13 +1619,34 @@ |
return SkSurface::NewPicture(info.fWidth, info.fHeight); |
} |
-void SkPictureRecord::addBitmap(const SkBitmap& bitmap) { |
+void SkPictureRecord::trackBitmapUse(int bitmapID, size_t offset) { |
+#ifndef SK_ALLOW_BITMAP_TRACKING |
+ return; |
+#endif |
+ |
+ if (!(fRecordFlags & SkPicture::kOptimizeForClippedPlayback_RecordingFlag)) { |
+ return; |
+ } |
+ |
+ if (SkBitmapHeap::INVALID_SLOT == bitmapID) { |
+ return; |
+ } |
+ |
+ if (NULL == fBitmapUseOffsets) { |
+ fBitmapUseOffsets.reset(SkNEW(SkOffsetTable)); |
+ } |
+ |
+ fBitmapUseOffsets->add(bitmapID, offset); |
+} |
+ |
+int SkPictureRecord::addBitmap(const SkBitmap& bitmap) { |
const int index = fBitmapHeap->insert(bitmap); |
// In debug builds, a bad return value from insert() will crash, allowing for debugging. In |
// release builds, the invalid value will be recorded so that the reader will know that there |
// was a problem. |
SkASSERT(index != SkBitmapHeap::INVALID_SLOT); |
this->addInt(index); |
+ return index; |
} |
void SkPictureRecord::addMatrix(const SkMatrix& matrix) { |