Index: src/core/SkPictureRecord.cpp |
diff --git a/src/core/SkPictureRecord.cpp b/src/core/SkPictureRecord.cpp |
index 7907ee0d2935f22b30ceca2be899d0b1b5a506e6..2822a1ac1643a2c0681418b79ae1ec75baf4c326 100644 |
--- a/src/core/SkPictureRecord.cpp |
+++ b/src/core/SkPictureRecord.cpp |
@@ -76,19 +76,44 @@ SkCanvas::SaveLayerStrategy SkPictureRecord::getSaveLayerStrategy(const SaveLaye |
void SkPictureRecord::recordSaveLayer(const SaveLayerRec& rec) { |
fContentInfo.onSaveLayer(); |
- // op + bool for 'bounds' |
+ // op + flatflags |
size_t size = 2 * kUInt32Size; |
+ uint32_t flatFlags = 0; |
+ |
if (rec.fBounds) { |
- size += sizeof(*rec.fBounds); // + rect |
+ flatFlags |= SAVELAYERREC_HAS_BOUNDS; |
+ size += sizeof(*rec.fBounds); |
+ } |
+ if (rec.fPaint) { |
+ flatFlags |= SAVELAYERREC_HAS_PAINT; |
+ size += sizeof(uint32_t); // index |
+ } |
+ if (rec.fBackdrop) { |
+ flatFlags |= SAVELAYERREC_HAS_BACKDROP; |
+ size += sizeof(uint32_t); // (paint) index |
+ } |
+ if (rec.fSaveLayerFlags) { |
+ flatFlags |= SAVELAYERREC_HAS_FLAGS; |
+ size += sizeof(uint32_t); |
} |
- // + paint index + flags |
- size += 2 * kUInt32Size; |
- |
- size_t initialOffset = this->addDraw(SAVE_LAYER_SAVELAYERFLAGS, &size); |
- this->addRectPtr(rec.fBounds); |
- this->addPaintPtr(rec.fPaint); |
- this->addInt(rec.fSaveLayerFlags); |
+ const size_t initialOffset = this->addDraw(SAVE_LAYER_SAVELAYERREC, &size); |
+ this->addInt(flatFlags); |
+ if (flatFlags & SAVELAYERREC_HAS_BOUNDS) { |
+ this->addRect(*rec.fBounds); |
+ } |
+ if (flatFlags & SAVELAYERREC_HAS_PAINT) { |
+ this->addPaintPtr(rec.fPaint); |
+ } |
+ if (flatFlags & SAVELAYERREC_HAS_BACKDROP) { |
+ // overkill, but we didn't already track single flattenables, so using a paint for that |
+ SkPaint paint; |
+ paint.setImageFilter(const_cast<SkImageFilter*>(rec.fBackdrop)); |
+ this->addPaint(paint); |
+ } |
+ if (flatFlags & SAVELAYERREC_HAS_FLAGS) { |
+ this->addInt(rec.fSaveLayerFlags); |
+ } |
this->validate(initialOffset, size); |
} |
@@ -224,7 +249,8 @@ void SkPictureRecord::fillRestoreOffsetPlaceholdersForCurrentStackLevel(uint32_t |
uint32_t opSize; |
DrawType drawOp = peek_op_and_size(&fWriter, -offset, &opSize); |
SkASSERT(SAVE_LAYER_SAVEFLAGS_DEPRECATED != drawOp); |
- SkASSERT(SAVE == drawOp || SAVE_LAYER_SAVELAYERFLAGS == drawOp); |
+ SkASSERT(SAVE_LAYER_SAVELAYERFLAGS_DEPRECATED_JAN_2016 != drawOp); |
+ SkASSERT(SAVE == drawOp || SAVE_LAYER_SAVELAYERREC == drawOp); |
} |
#endif |
} |