Index: src/core/SkPictureRecord.cpp |
diff --git a/src/core/SkPictureRecord.cpp b/src/core/SkPictureRecord.cpp |
index 88975d245253c2f6cf25916ea6829cd1a59dfaab..0cdf973e1a006df60bd69aa84a9915ee7ec4e161 100644 |
--- a/src/core/SkPictureRecord.cpp |
+++ b/src/core/SkPictureRecord.cpp |
@@ -155,6 +155,8 @@ void SkPictureRecord::willSave() { |
} |
void SkPictureRecord::recordSave() { |
+ fContentInfo.onSave(); |
+ |
// op only |
size_t size = kSaveSize; |
size_t initialOffset = this->addDraw(SAVE, &size); |
@@ -183,6 +185,8 @@ SkCanvas::SaveLayerStrategy SkPictureRecord::willSaveLayer(const SkRect* bounds, |
void SkPictureRecord::recordSaveLayer(const SkRect* bounds, const SkPaint* paint, |
SaveFlags flags) { |
+ fContentInfo.onSaveLayer(); |
+ |
// op + bool for 'bounds' |
size_t size = 2 * kUInt32Size; |
if (NULL != bounds) { |
@@ -526,8 +530,10 @@ enum PictureRecordOptType { |
}; |
enum PictureRecordOptFlags { |
- kSkipIfBBoxHierarchy_Flag = 0x1, // Optimization should be skipped if the |
- // SkPicture has a bounding box hierarchy. |
+ kSkipIfBBoxHierarchy_Flag = 0x1, // Optimization should be skipped if the |
+ // SkPicture has a bounding box hierarchy. |
+ kRescindLastSave_Flag = 0x2, |
+ kRescindLastSaveLayer_Flag = 0x4, |
}; |
struct PictureRecordOpt { |
@@ -546,9 +552,10 @@ static const PictureRecordOpt gPictureRecordOpts[] = { |
// SkPictureStateTree, and applying the optimization introduces significant |
// record time overhead because it requires rewinding contents that were |
// recorded into the BBoxHierarchy. |
- { collapse_save_clip_restore, kRewind_OptType, kSkipIfBBoxHierarchy_Flag }, |
- { remove_save_layer1, kCollapseSaveLayer_OptType, 0 }, |
- { remove_save_layer2, kCollapseSaveLayer_OptType, 0 } |
+ { collapse_save_clip_restore, kRewind_OptType, |
+ kSkipIfBBoxHierarchy_Flag|kRescindLastSave_Flag }, |
+ { remove_save_layer1, kCollapseSaveLayer_OptType, kRescindLastSaveLayer_Flag }, |
+ { remove_save_layer2, kCollapseSaveLayer_OptType, kRescindLastSaveLayer_Flag } |
}; |
// This is called after an optimization has been applied to the command stream |
@@ -603,6 +610,11 @@ void SkPictureRecord::willRestore() { |
// Some optimization fired so don't add the RESTORE |
apply_optimization_to_bbh(gPictureRecordOpts[opt].fType, |
fStateTree, fBoundingHierarchy); |
+ if (gPictureRecordOpts[opt].fFlags & kRescindLastSave_Flag) { |
+ fContentInfo.rescindLastSave(); |
+ } else if (gPictureRecordOpts[opt].fFlags & kRescindLastSaveLayer_Flag) { |
+ fContentInfo.rescindLastSaveLayer(); |
+ } |
break; |
} |
} |
@@ -619,6 +631,8 @@ void SkPictureRecord::willRestore() { |
} |
void SkPictureRecord::recordRestore(bool fillInSkips) { |
+ fContentInfo.onRestore(); |
+ |
if (fillInSkips) { |
this->fillRestoreOffsetPlaceholdersForCurrentStackLevel((uint32_t)fWriter.bytesWritten()); |
} |