• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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