Home | History | Annotate | Download | only in core
      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 
     17 SkPictureRecorder::~SkPictureRecorder() {
     18     this->reset();
     19 }
     20 
     21 void SkPictureRecorder::reset() {
     22     SkSafeSetNull(fPictureRecord);
     23     SkSafeSetNull(fRecorder);
     24     SkDELETE(fRecord);
     25     fRecord = NULL;
     26 }
     27 
     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 
     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 
     61 SkCanvas* SkPictureRecorder::getRecordingCanvas() {
     62     if (NULL != fRecorder) {
     63         return fRecorder;
     64     }
     65     return fPictureRecord;
     66 }
     67 
     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 
     86 void SkPictureRecorder::internalOnly_EnableOpts(bool enableOpts) {
     87     if (NULL != fPictureRecord) {
     88         fPictureRecord->internalOnly_EnableOpts(enableOpts);
     89     }
     90 }
     91 
     92 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