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 "SkPictureRecord.h"
     10 #include "SkPictureRecorder.h"
     11 #include "SkRecord.h"
     12 #include "SkRecordDraw.h"
     13 #include "SkRecorder.h"
     14 #include "SkTypes.h"
     15 
     16 SkPictureRecorder::SkPictureRecorder() {}
     17 
     18 SkPictureRecorder::~SkPictureRecorder() {}
     19 
     20 SkCanvas* SkPictureRecorder::beginRecording(SkScalar width, SkScalar height,
     21                                             SkBBHFactory* bbhFactory /* = NULL */,
     22                                             uint32_t recordFlags /* = 0 */) {
     23 #ifdef SK_PICTURE_USE_SK_RECORD
     24     return EXPERIMENTAL_beginRecording(width, height, bbhFactory);
     25 #else
     26     return DEPRECATED_beginRecording(width, height, bbhFactory, recordFlags);
     27 #endif
     28 }
     29 
     30 SkCanvas* SkPictureRecorder::DEPRECATED_beginRecording(SkScalar width, SkScalar height,
     31                                                        SkBBHFactory* bbhFactory /* = NULL */,
     32                                                        uint32_t recordFlags /* = 0 */) {
     33     fCullWidth = width;
     34     fCullHeight = height;
     35 
     36     const SkISize size = SkISize::Make(width, height);
     37 
     38     if (bbhFactory) {
     39         // We don't need to hold a ref on the BBH ourselves, but might as well for
     40         // consistency with EXPERIMENTAL_beginRecording(), which does need to.
     41         fBBH.reset((*bbhFactory)(width, height));
     42         SkASSERT(fBBH.get());
     43         fPictureRecord.reset(SkNEW_ARGS(SkBBoxHierarchyRecord, (size, recordFlags, fBBH.get())));
     44     } else {
     45         fPictureRecord.reset(SkNEW_ARGS(SkPictureRecord, (size, recordFlags)));
     46     }
     47 
     48     fPictureRecord->beginRecording();
     49     return this->getRecordingCanvas();
     50 }
     51 
     52 SkCanvas* SkPictureRecorder::EXPERIMENTAL_beginRecording(SkScalar width, SkScalar height,
     53                                                          SkBBHFactory* bbhFactory /* = NULL */) {
     54     fCullWidth = width;
     55     fCullHeight = height;
     56 
     57     if (bbhFactory) {
     58         fBBH.reset((*bbhFactory)(width, height));
     59         SkASSERT(fBBH.get());
     60     }
     61 
     62     fRecord.reset(SkNEW(SkRecord));
     63     fRecorder.reset(SkNEW_ARGS(SkRecorder, (fRecord.get(), width, height)));
     64     return this->getRecordingCanvas();
     65 }
     66 
     67 SkCanvas* SkPictureRecorder::getRecordingCanvas() {
     68     if (fRecorder.get()) {
     69         return fRecorder.get();
     70     }
     71     return fPictureRecord.get();
     72 }
     73 
     74 SkPicture* SkPictureRecorder::endRecording() {
     75     SkPicture* picture = NULL;
     76 
     77     if (fRecord.get()) {
     78         picture = SkNEW_ARGS(SkPicture, (fCullWidth, fCullHeight,
     79                                          fRecord.detach(), fBBH.get()));
     80     }
     81 
     82     if (fPictureRecord.get()) {
     83         fPictureRecord->endRecording();
     84         const bool deepCopyOps = false;
     85         picture = SkNEW_ARGS(SkPicture, (fCullWidth, fCullHeight,
     86                                          *fPictureRecord.get(), deepCopyOps));
     87     }
     88 
     89     return picture;
     90 }
     91 
     92 void SkPictureRecorder::internalOnly_EnableOpts(bool enableOpts) {
     93     if (fPictureRecord.get()) {
     94         fPictureRecord->internalOnly_EnableOpts(enableOpts);
     95     }
     96 }
     97 
     98 void SkPictureRecorder::partialReplay(SkCanvas* canvas) const {
     99     if (NULL == canvas) {
    100         return;
    101     }
    102 
    103     if (fRecord.get()) {
    104         SkRecordDraw(*fRecord, canvas, NULL/*bbh*/, NULL/*callback*/);
    105     }
    106 
    107     if (fPictureRecord.get()) {
    108         const bool deepCopyOps = true;
    109         SkPicture picture(fCullWidth, fCullHeight,
    110                           *fPictureRecord.get(), deepCopyOps);
    111         picture.playback(canvas);
    112     }
    113 }
    114