1770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.com/*
2770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.com * Copyright 2014 Google Inc.
3770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.com *
4770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.com * Use of this source code is governed by a BSD-style license that can be
5770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.com * found in the LICENSE file.
6770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.com */
7770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.com
8643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillips#include "SkBBoxHierarchyRecord.h"
96d3eaeabddd03b1bf440345f1f3f9aa5b6dd0717commit-bot@chromium.org#include "SkPicturePlayback.h"
10643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillips#include "SkPictureRecord.h"
11770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.com#include "SkPictureRecorder.h"
12887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein#include "SkRecord.h"
13887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein#include "SkRecordDraw.h"
14887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein#include "SkRecorder.h"
15887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein#include "SkTypes.h"
16643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillips
17643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillipsSkPictureRecorder::~SkPictureRecorder() {
18887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    this->reset();
19887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein}
20887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein
21887f3979f0c717e69a8b7d169169bc27eb46d3b5mtkleinvoid SkPictureRecorder::reset() {
22887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    SkSafeSetNull(fPictureRecord);
23887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    SkSafeSetNull(fRecorder);
24887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    SkDELETE(fRecord);
25887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    fRecord = NULL;
26643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillips}
27770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.com
28770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.comSkCanvas* SkPictureRecorder::beginRecording(int width, int height,
29770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.com                                            SkBBHFactory* bbhFactory /* = NULL */,
30770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.com                                            uint32_t recordFlags /* = 0 */) {
31887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    this->reset();  // terminate any prior recording(s)
320bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips    fWidth = width;
330bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips    fHeight = height;
34643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillips
35643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillips    const SkISize size = SkISize::Make(width, height);
36643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillips
37643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillips    if (NULL != bbhFactory) {
38643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillips        SkAutoTUnref<SkBBoxHierarchy> tree((*bbhFactory)(width, height));
39643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillips        SkASSERT(NULL != tree);
40887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein        fPictureRecord = SkNEW_ARGS(SkBBoxHierarchyRecord, (size, recordFlags, tree.get()));
41643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillips    } else {
42887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein        fPictureRecord = SkNEW_ARGS(SkPictureRecord, (size, recordFlags));
43643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillips    }
44643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillips
45887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    fPictureRecord->beginRecording();
46887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    return this->getRecordingCanvas();
47887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein}
48887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein
49887f3979f0c717e69a8b7d169169bc27eb46d3b5mtkleinSkCanvas* SkPictureRecorder::EXPERIMENTAL_beginRecording(int width, int height,
50887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein                                                         SkBBHFactory* bbhFactory /* = NULL */) {
51887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    this->reset();
52887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    fWidth = width;
53887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    fHeight = height;
54643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillips
55887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    // TODO: plumb bbhFactory through
56887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    fRecord   = SkNEW(SkRecord);
57887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    fRecorder = SkNEW_ARGS(SkRecorder, (fRecord, width, height));
58887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    return this->getRecordingCanvas();
59643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillips}
60643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillips
61643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillipsSkCanvas* SkPictureRecorder::getRecordingCanvas() {
62887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    if (NULL != fRecorder) {
63887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein        return fRecorder;
64887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    }
65887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    return fPictureRecord;
66643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillips}
67643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillips
68643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillipsSkPicture* SkPictureRecorder::endRecording() {
69887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    SkPicture* picture = NULL;
70643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillips
71887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    if (NULL != fRecorder) {
72887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein        // TODO: picture = SkNEW_ARGS(SkPicture, (fWidth, fHeight, fRecord));
73887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein        //       fRecord = NULL;
74887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    }
75643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillips
76887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    if (NULL != fPictureRecord) {
77887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein        fPictureRecord->endRecording();
78887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein        const bool deepCopyOps = false;
79887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein        picture = SkNEW_ARGS(SkPicture, (fWidth, fHeight, *fPictureRecord, deepCopyOps));
80887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    }
81643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillips
82887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    this->reset();
83887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    return picture;
84643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillips}
85643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillips
86643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillipsvoid SkPictureRecorder::internalOnly_EnableOpts(bool enableOpts) {
87887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    if (NULL != fPictureRecord) {
88887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein        fPictureRecord->internalOnly_EnableOpts(enableOpts);
89643b8bd6617e333f7a970a57ad9166f3d6675d1arobertphillips    }
90770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.com}
916d3eaeabddd03b1bf440345f1f3f9aa5b6dd0717commit-bot@chromium.org
922246e325b8710389d8f718843356e410f683dd25commit-bot@chromium.orgvoid SkPictureRecorder::partialReplay(SkCanvas* canvas) const {
93887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    if (NULL == canvas) {
946d3eaeabddd03b1bf440345f1f3f9aa5b6dd0717commit-bot@chromium.org        return;
956d3eaeabddd03b1bf440345f1f3f9aa5b6dd0717commit-bot@chromium.org    }
966d3eaeabddd03b1bf440345f1f3f9aa5b6dd0717commit-bot@chromium.org
97887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    if (NULL != fRecorder) {
98887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein        SkRecordDraw(*fRecord, canvas);
99887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    }
100887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein
101887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    if (NULL != fPictureRecord) {
102887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein        const bool deepCopyOps = true;
103887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein        SkPicture picture(fWidth, fHeight, *fPictureRecord, deepCopyOps);
104887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein        picture.draw(canvas);
105887f3979f0c717e69a8b7d169169bc27eb46d3b5mtklein    }
1066d3eaeabddd03b1bf440345f1f3f9aa5b6dd0717commit-bot@chromium.org}
107