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
~SkPictureRecorder()17 SkPictureRecorder::~SkPictureRecorder() {
18 this->reset();
19 }
20
reset()21 void SkPictureRecorder::reset() {
22 SkSafeSetNull(fPictureRecord);
23 SkSafeSetNull(fRecorder);
24 SkDELETE(fRecord);
25 fRecord = NULL;
26 }
27
beginRecording(int width,int height,SkBBHFactory * bbhFactory,uint32_t recordFlags)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
EXPERIMENTAL_beginRecording(int width,int height,SkBBHFactory * bbhFactory)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
getRecordingCanvas()61 SkCanvas* SkPictureRecorder::getRecordingCanvas() {
62 if (NULL != fRecorder) {
63 return fRecorder;
64 }
65 return fPictureRecord;
66 }
67
endRecording()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
internalOnly_EnableOpts(bool enableOpts)86 void SkPictureRecorder::internalOnly_EnableOpts(bool enableOpts) {
87 if (NULL != fPictureRecord) {
88 fPictureRecord->internalOnly_EnableOpts(enableOpts);
89 }
90 }
91
partialReplay(SkCanvas * canvas) const92 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