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 #ifndef SkPictureRecorder_DEFINED
      9 #define SkPictureRecorder_DEFINED
     10 
     11 #include "SkBBHFactory.h"
     12 #include "SkPicture.h"
     13 #include "SkRefCnt.h"
     14 
     15 #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
     16 namespace android {
     17     class Picture;
     18 };
     19 #endif
     20 
     21 class SkCanvas;
     22 class SkDrawable;
     23 class SkPictureRecord;
     24 class SkRecord;
     25 class SkRecorder;
     26 
     27 class SK_API SkPictureRecorder : SkNoncopyable {
     28 public:
     29     SkPictureRecorder();
     30     ~SkPictureRecorder();
     31 
     32     enum RecordFlags {
     33         // This flag indicates that, if some BHH is being computed, saveLayer
     34         // information should also be extracted at the same time.
     35         kComputeSaveLayerInfo_RecordFlag = 0x01
     36     };
     37 
     38     /** Returns the canvas that records the drawing commands.
     39         @param bounds the cull rect used when recording this picture. Any drawing the falls outside
     40                       of this rect is undefined, and may be drawn or it may not.
     41         @param bbhFactory factory to create desired acceleration structure
     42         @param recordFlags optional flags that control recording.
     43         @return the canvas.
     44     */
     45     SkCanvas* beginRecording(const SkRect& bounds,
     46                              SkBBHFactory* bbhFactory = NULL,
     47                              uint32_t recordFlags = 0);
     48 
     49     SkCanvas* beginRecording(SkScalar width, SkScalar height,
     50                              SkBBHFactory* bbhFactory = NULL,
     51                              uint32_t recordFlags = 0) {
     52         return this->beginRecording(SkRect::MakeWH(width, height), bbhFactory, recordFlags);
     53     }
     54 
     55     /** Returns the recording canvas if one is active, or NULL if recording is
     56         not active. This does not alter the refcnt on the canvas (if present).
     57     */
     58     SkCanvas* getRecordingCanvas();
     59 
     60     /**
     61      *  Signal that the caller is done recording. This invalidates the canvas returned by
     62      *  beginRecording/getRecordingCanvas. Ownership of the object is passed to the caller, who
     63      *  must call unref() when they are done using it.
     64      *
     65      *  The returned picture is immutable. If during recording drawables were added to the canvas,
     66      *  these will have been "drawn" into a recording canvas, so that this resulting picture will
     67      *  reflect their current state, but will not contain a live reference to the drawables
     68      *  themselves.
     69      */
     70     SkPicture* SK_WARN_UNUSED_RESULT endRecordingAsPicture();
     71 
     72     /**
     73      *  Signal that the caller is done recording. This invalidates the canvas returned by
     74      *  beginRecording/getRecordingCanvas. Ownership of the object is passed to the caller, who
     75      *  must call unref() when they are done using it.
     76      *
     77      *  Unlike endRecordingAsPicture(), which returns an immutable picture, the returned drawable
     78      *  may contain live references to other drawables (if they were added to the recording canvas)
     79      *  and therefore this drawable will reflect the current state of those nested drawables anytime
     80      *  it is drawn or a new picture is snapped from it (by calling drawable->newPictureSnapshot()).
     81      */
     82     SkDrawable* SK_WARN_UNUSED_RESULT endRecordingAsDrawable();
     83 
     84     // Legacy API -- use endRecordingAsPicture instead.
     85     SkPicture* SK_WARN_UNUSED_RESULT endRecording() { return this->endRecordingAsPicture(); }
     86 
     87 private:
     88     void reset();
     89 
     90     /** Replay the current (partially recorded) operation stream into
     91         canvas. This call doesn't close the current recording.
     92     */
     93 #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
     94     friend class android::Picture;
     95 #endif
     96     friend class SkPictureRecorderReplayTester; // for unit testing
     97     void partialReplay(SkCanvas* canvas) const;
     98 
     99     bool                          fActivelyRecording;
    100     uint32_t                      fFlags;
    101     SkRect                        fCullRect;
    102     SkAutoTUnref<SkBBoxHierarchy> fBBH;
    103     SkAutoTUnref<SkRecorder>      fRecorder;
    104     SkAutoTUnref<SkRecord>        fRecord;
    105 
    106     typedef SkNoncopyable INHERITED;
    107 };
    108 
    109 #endif
    110