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