Index: src/core/SkPictureRecord.cpp |
=================================================================== |
--- src/core/SkPictureRecord.cpp (revision 13658) |
+++ src/core/SkPictureRecord.cpp (working copy) |
@@ -44,6 +44,8 @@ |
fBitmapHeap = SkNEW(SkBitmapHeap); |
fFlattenableHeap.setBitmapStorage(fBitmapHeap); |
fPathHeap = NULL; // lazy allocate |
+ fBitmapUseOffsets = NULL; // lazy allocate |
+ |
#ifndef SK_COLLAPSE_MATRIX_CLIP_STATE |
fFirstSavedLayerIndex = kNoSavedLayerIndex; |
#endif |
@@ -58,6 +60,7 @@ |
SkPictureRecord::~SkPictureRecord() { |
SkSafeUnref(fBitmapHeap); |
SkSafeUnref(fPathHeap); |
+ SkSafeUnref(fBitmapUseOffsets); |
SkSafeUnref(fBoundingHierarchy); |
SkSafeUnref(fStateTree); |
fFlattenableHeap.setBitmapStorage(NULL); |
@@ -1125,10 +1128,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 +1156,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 +1179,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 +1200,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 +1222,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 +1620,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) { |
mtklein
2014/03/06 16:20:38
Is this something we can also SkASSERT doesn't hap
robertphillips
2014/03/06 20:18:26
addBitmap can return this value so we need this ch
|
+ return; |
+ } |
+ |
+ if (NULL == fBitmapUseOffsets) { |
+ fBitmapUseOffsets = 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) { |