1 /* 2 * Copyright 2014 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "SkBBoxHierarchyRecord.h" 9 #include "SkPicturePlayback.h" 10 #include "SkPictureRecord.h" 11 #include "SkPictureRecorder.h" 12 #include "SkRecord.h" 13 #include "SkRecordDraw.h" 14 #include "SkRecorder.h" 15 #include "SkTypes.h" 16 17 SkPictureRecorder::~SkPictureRecorder() { 18 this->reset(); 19 } 20 21 void SkPictureRecorder::reset() { 22 SkSafeSetNull(fPictureRecord); 23 SkSafeSetNull(fRecorder); 24 SkDELETE(fRecord); 25 fRecord = NULL; 26 } 27 28 SkCanvas* SkPictureRecorder::beginRecording(int width, int height, 29 SkBBHFactory* bbhFactory /* = NULL */, 30 uint32_t recordFlags /* = 0 */) { 31 this->reset(); // terminate any prior recording(s) 32 fWidth = width; 33 fHeight = height; 34 35 const SkISize size = SkISize::Make(width, height); 36 37 if (NULL != bbhFactory) { 38 SkAutoTUnref<SkBBoxHierarchy> tree((*bbhFactory)(width, height)); 39 SkASSERT(NULL != tree); 40 fPictureRecord = SkNEW_ARGS(SkBBoxHierarchyRecord, (size, recordFlags, tree.get())); 41 } else { 42 fPictureRecord = SkNEW_ARGS(SkPictureRecord, (size, recordFlags)); 43 } 44 45 fPictureRecord->beginRecording(); 46 return this->getRecordingCanvas(); 47 } 48 49 SkCanvas* SkPictureRecorder::EXPERIMENTAL_beginRecording(int width, int height, 50 SkBBHFactory* bbhFactory /* = NULL */) { 51 this->reset(); 52 fWidth = width; 53 fHeight = height; 54 55 // TODO: plumb bbhFactory through 56 fRecord = SkNEW(SkRecord); 57 fRecorder = SkNEW_ARGS(SkRecorder, (fRecord, width, height)); 58 return this->getRecordingCanvas(); 59 } 60 61 SkCanvas* SkPictureRecorder::getRecordingCanvas() { 62 if (NULL != fRecorder) { 63 return fRecorder; 64 } 65 return fPictureRecord; 66 } 67 68 SkPicture* SkPictureRecorder::endRecording() { 69 SkPicture* picture = NULL; 70 71 if (NULL != fRecorder) { 72 // TODO: picture = SkNEW_ARGS(SkPicture, (fWidth, fHeight, fRecord)); 73 // fRecord = NULL; 74 } 75 76 if (NULL != fPictureRecord) { 77 fPictureRecord->endRecording(); 78 const bool deepCopyOps = false; 79 picture = SkNEW_ARGS(SkPicture, (fWidth, fHeight, *fPictureRecord, deepCopyOps)); 80 } 81 82 this->reset(); 83 return picture; 84 } 85 86 void SkPictureRecorder::internalOnly_EnableOpts(bool enableOpts) { 87 if (NULL != fPictureRecord) { 88 fPictureRecord->internalOnly_EnableOpts(enableOpts); 89 } 90 } 91 92 void SkPictureRecorder::partialReplay(SkCanvas* canvas) const { 93 if (NULL == canvas) { 94 return; 95 } 96 97 if (NULL != fRecorder) { 98 SkRecordDraw(*fRecord, canvas); 99 } 100 101 if (NULL != fPictureRecord) { 102 const bool deepCopyOps = true; 103 SkPicture picture(fWidth, fHeight, *fPictureRecord, deepCopyOps); 104 picture.draw(canvas); 105 } 106 } 107