Chromium Code Reviews| 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) { |