SkPictureRecorder.cpp revision e2f2b984443e870319e107374f7d786f243a20ae
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 "SkTypes.h"
13
14SkPictureRecorder::~SkPictureRecorder() {
15    SkSafeSetNull(fCanvas);
16}
17
18SkCanvas* SkPictureRecorder::beginRecording(int width, int height,
19                                            SkBBHFactory* bbhFactory /* = NULL */,
20                                            uint32_t recordFlags /* = 0 */) {
21    SkSafeSetNull(fCanvas);
22    fPicture.reset(SkNEW(SkPicture));
23
24    fPicture->fWidth = width;
25    fPicture->fHeight = height;
26
27    const SkISize size = SkISize::Make(width, height);
28
29    if (NULL != bbhFactory) {
30        SkAutoTUnref<SkBBoxHierarchy> tree((*bbhFactory)(width, height));
31        SkASSERT(NULL != tree);
32        fCanvas = SkNEW_ARGS(SkBBoxHierarchyRecord, (fPicture, size, recordFlags, tree.get()));
33    } else {
34        fCanvas = SkNEW_ARGS(SkPictureRecord, (fPicture, size, recordFlags));
35    }
36
37    fCanvas->beginRecording();
38
39    return fCanvas;
40}
41
42SkCanvas* SkPictureRecorder::getRecordingCanvas() {
43    return fCanvas;
44}
45
46SkPicture* SkPictureRecorder::endRecording() {
47    if (NULL == fPicture.get()) {
48        return NULL;
49    }
50
51    SkASSERT(NULL == fPicture->fPlayback);
52    SkASSERT(NULL != fCanvas);
53
54    fCanvas->endRecording();
55
56    SkPictInfo info;
57    fPicture->createHeader(&info);
58    fPicture->fPlayback = SkNEW_ARGS(SkPicturePlayback, (fPicture, *fCanvas, info));
59
60    SkSafeSetNull(fCanvas);
61
62    return fPicture.detach();
63}
64
65void SkPictureRecorder::internalOnly_EnableOpts(bool enableOpts) {
66    if (NULL != fCanvas) {
67        fCanvas->internalOnly_EnableOpts(enableOpts);
68    }
69}
70
71void SkPictureRecorder::partialReplay(SkCanvas* canvas) const {
72    if (NULL == fPicture.get() || NULL == canvas) {
73        // Not recording or nothing to replay into
74        return;
75    }
76
77    SkASSERT(NULL != fCanvas);
78
79    SkAutoTDelete<SkPicturePlayback> playback(SkPicture::FakeEndRecording(fPicture.get(),
80                                                                          *fCanvas,
81                                                                          false));
82    playback->draw(*canvas, NULL);
83}
84