| Index: src/core/SkPictureRecorder.cpp | 
| diff --git a/src/core/SkPictureRecorder.cpp b/src/core/SkPictureRecorder.cpp | 
| index a157d0dfe0a5bd76b4159a853498d6f560e3e9ea..8ce770efce8d16957e145468aea3711f7eac5a4a 100644 | 
| --- a/src/core/SkPictureRecorder.cpp | 
| +++ b/src/core/SkPictureRecorder.cpp | 
| @@ -51,17 +51,26 @@ SkCanvas* SkPictureRecorder::getRecordingCanvas() { | 
| return fActivelyRecording ? fRecorder.get() : nullptr; | 
| } | 
|  | 
| -sk_sp<SkPicture> SkPictureRecorder::finishRecordingAsPicture() { | 
| +sk_sp<SkPicture> SkPictureRecorder::finishRecordingAsPicture(uint32_t finishFlags) { | 
| fActivelyRecording = false; | 
| fRecorder->restoreToCount(1);  // If we were missing any restores, add them now. | 
|  | 
| if (fRecord->count() == 0) { | 
| +        if (finishFlags & kReturnNullForEmpty_FinishFlag) { | 
| +            return nullptr; | 
| +        } | 
| return fMiniRecorder.detachAsPicture(fCullRect); | 
| } | 
|  | 
| // TODO: delay as much of this work until just before first playback? | 
| SkRecordOptimize(fRecord); | 
|  | 
| +    if (fRecord->count() == 0) { | 
| +        if (finishFlags & kReturnNullForEmpty_FinishFlag) { | 
| +            return nullptr; | 
| +        } | 
| +    } | 
| + | 
| SkAutoTUnref<SkLayerInfo> saveLayerData; | 
|  | 
| if (fBBH && (fFlags & kComputeSaveLayerInfo_RecordFlag)) { | 
| @@ -97,9 +106,10 @@ sk_sp<SkPicture> SkPictureRecorder::finishRecordingAsPicture() { | 
| saveLayerData.release(), subPictureBytes); | 
| } | 
|  | 
| -sk_sp<SkPicture> SkPictureRecorder::finishRecordingAsPictureWithCull(const SkRect& cullRect) { | 
| +sk_sp<SkPicture> SkPictureRecorder::finishRecordingAsPictureWithCull(const SkRect& cullRect, | 
| +                                                                     uint32_t finishFlags) { | 
| fCullRect = cullRect; | 
| -    return this->finishRecordingAsPicture(); | 
| +    return this->finishRecordingAsPicture(finishFlags); | 
| } | 
|  | 
|  | 
| @@ -118,14 +128,19 @@ void SkPictureRecorder::partialReplay(SkCanvas* canvas) const { | 
| SkRecordDraw(*fRecord, canvas, nullptr, drawables, drawableCount, nullptr/*bbh*/, nullptr/*callback*/); | 
| } | 
|  | 
| -sk_sp<SkDrawable> SkPictureRecorder::finishRecordingAsDrawable() { | 
| +sk_sp<SkDrawable> SkPictureRecorder::finishRecordingAsDrawable(uint32_t finishFlags) { | 
| fActivelyRecording = false; | 
| fRecorder->flushMiniRecorder(); | 
| fRecorder->restoreToCount(1);  // If we were missing any restores, add them now. | 
|  | 
| -    // TODO: delay as much of this work until just before first playback? | 
| SkRecordOptimize(fRecord); | 
|  | 
| +    if (fRecord->count() == 0) { | 
| +        if (finishFlags & kReturnNullForEmpty_FinishFlag) { | 
| +            return nullptr; | 
| +        } | 
| +    } | 
| + | 
| if (fBBH.get()) { | 
| SkAutoTMalloc<SkRect> bounds(fRecord->count()); | 
| SkRecordFillBounds(fCullRect, *fRecord, bounds); | 
|  |