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