2014-04-18 18:04:41 +00:00
|
|
|
/*
|
|
|
|
* Copyright 2014 Google Inc.
|
|
|
|
*
|
|
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
|
|
* found in the LICENSE file.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef SkPictureRecorder_DEFINED
|
|
|
|
#define SkPictureRecorder_DEFINED
|
|
|
|
|
2015-07-29 20:31:22 +00:00
|
|
|
#include "../private/SkMiniRecorder.h"
|
2014-04-18 18:04:41 +00:00
|
|
|
#include "SkBBHFactory.h"
|
|
|
|
#include "SkPicture.h"
|
|
|
|
#include "SkRefCnt.h"
|
|
|
|
|
2014-06-17 20:42:59 +00:00
|
|
|
#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
|
|
|
|
namespace android {
|
|
|
|
class Picture;
|
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
2016-08-01 20:17:47 +00:00
|
|
|
class GrContext;
|
2014-04-18 18:04:41 +00:00
|
|
|
class SkCanvas;
|
2015-02-06 16:36:15 +00:00
|
|
|
class SkDrawable;
|
2014-06-08 12:55:05 +00:00
|
|
|
class SkPictureRecord;
|
2014-06-17 19:08:15 +00:00
|
|
|
class SkRecord;
|
|
|
|
class SkRecorder;
|
2014-04-18 18:04:41 +00:00
|
|
|
|
|
|
|
class SK_API SkPictureRecorder : SkNoncopyable {
|
|
|
|
public:
|
2014-06-23 17:29:10 +00:00
|
|
|
SkPictureRecorder();
|
2014-06-08 12:55:05 +00:00
|
|
|
~SkPictureRecorder();
|
|
|
|
|
2014-11-11 12:54:49 +00:00
|
|
|
enum RecordFlags {
|
2015-11-17 14:18:31 +00:00
|
|
|
// If you call drawPicture() or drawDrawable() on the recording canvas, this flag forces
|
|
|
|
// that object to playback its contents immediately rather than reffing the object.
|
2016-07-14 20:44:14 +00:00
|
|
|
kPlaybackDrawPicture_RecordFlag = 1 << 0,
|
2016-07-06 16:29:16 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
enum FinishFlags {
|
|
|
|
kReturnNullForEmpty_FinishFlag = 1 << 0, // no draw-ops will return nullptr
|
2014-11-11 12:54:49 +00:00
|
|
|
};
|
|
|
|
|
2014-04-18 18:04:41 +00:00
|
|
|
/** Returns the canvas that records the drawing commands.
|
2014-11-19 16:04:34 +00:00
|
|
|
@param bounds the cull rect used when recording this picture. Any drawing the falls outside
|
|
|
|
of this rect is undefined, and may be drawn or it may not.
|
2014-04-18 18:04:41 +00:00
|
|
|
@param bbhFactory factory to create desired acceleration structure
|
|
|
|
@param recordFlags optional flags that control recording.
|
|
|
|
@return the canvas.
|
|
|
|
*/
|
2014-11-19 16:04:34 +00:00
|
|
|
SkCanvas* beginRecording(const SkRect& bounds,
|
2014-11-19 14:59:41 +00:00
|
|
|
SkBBHFactory* bbhFactory = NULL,
|
2014-11-19 15:17:16 +00:00
|
|
|
uint32_t recordFlags = 0);
|
2014-11-19 14:59:41 +00:00
|
|
|
|
2014-11-19 16:04:34 +00:00
|
|
|
SkCanvas* beginRecording(SkScalar width, SkScalar height,
|
|
|
|
SkBBHFactory* bbhFactory = NULL,
|
|
|
|
uint32_t recordFlags = 0) {
|
|
|
|
return this->beginRecording(SkRect::MakeWH(width, height), bbhFactory, recordFlags);
|
|
|
|
}
|
|
|
|
|
2014-04-18 18:04:41 +00:00
|
|
|
/** Returns the recording canvas if one is active, or NULL if recording is
|
|
|
|
not active. This does not alter the refcnt on the canvas (if present).
|
|
|
|
*/
|
2014-06-08 12:55:05 +00:00
|
|
|
SkCanvas* getRecordingCanvas();
|
2014-04-18 18:04:41 +00:00
|
|
|
|
2014-11-24 22:41:51 +00:00
|
|
|
/**
|
|
|
|
* Signal that the caller is done recording. This invalidates the canvas returned by
|
|
|
|
* beginRecording/getRecordingCanvas. Ownership of the object is passed to the caller, who
|
|
|
|
* must call unref() when they are done using it.
|
|
|
|
*
|
|
|
|
* The returned picture is immutable. If during recording drawables were added to the canvas,
|
|
|
|
* these will have been "drawn" into a recording canvas, so that this resulting picture will
|
|
|
|
* reflect their current state, but will not contain a live reference to the drawables
|
|
|
|
* themselves.
|
|
|
|
*/
|
2016-07-06 16:29:16 +00:00
|
|
|
sk_sp<SkPicture> finishRecordingAsPicture(uint32_t endFlags = 0);
|
2014-11-24 22:41:51 +00:00
|
|
|
|
2015-07-07 21:27:10 +00:00
|
|
|
/**
|
|
|
|
* Signal that the caller is done recording, and update the cull rect to use for bounding
|
|
|
|
* box hierarchy (BBH) generation. The behavior is the same as calling
|
|
|
|
* endRecordingAsPicture(), except that this method updates the cull rect initially passed
|
|
|
|
* into beginRecording.
|
|
|
|
* @param cullRect the new culling rectangle to use as the overall bound for BBH generation
|
|
|
|
* and subsequent culling operations.
|
|
|
|
* @return the picture containing the recorded content.
|
|
|
|
*/
|
2016-07-06 16:29:16 +00:00
|
|
|
sk_sp<SkPicture> finishRecordingAsPictureWithCull(const SkRect& cullRect,
|
|
|
|
uint32_t endFlags = 0);
|
2015-07-07 21:27:10 +00:00
|
|
|
|
2014-11-24 22:41:51 +00:00
|
|
|
/**
|
|
|
|
* Signal that the caller is done recording. This invalidates the canvas returned by
|
|
|
|
* beginRecording/getRecordingCanvas. Ownership of the object is passed to the caller, who
|
|
|
|
* must call unref() when they are done using it.
|
|
|
|
*
|
|
|
|
* Unlike endRecordingAsPicture(), which returns an immutable picture, the returned drawable
|
|
|
|
* may contain live references to other drawables (if they were added to the recording canvas)
|
|
|
|
* and therefore this drawable will reflect the current state of those nested drawables anytime
|
|
|
|
* it is drawn or a new picture is snapped from it (by calling drawable->newPictureSnapshot()).
|
|
|
|
*/
|
2016-07-06 16:29:16 +00:00
|
|
|
sk_sp<SkDrawable> finishRecordingAsDrawable(uint32_t endFlags = 0);
|
2014-11-24 22:41:51 +00:00
|
|
|
|
2016-03-18 14:25:55 +00:00
|
|
|
#ifdef SK_SUPPORT_LEGACY_PICTURE_PTR
|
|
|
|
SkPicture* SK_WARN_UNUSED_RESULT endRecordingAsPicture() {
|
|
|
|
return this->finishRecordingAsPicture().release();
|
|
|
|
}
|
|
|
|
SkPicture* SK_WARN_UNUSED_RESULT endRecordingAsPicture(const SkRect& cullRect) {
|
|
|
|
return this->finishRecordingAsPictureWithCull(cullRect).release();
|
|
|
|
}
|
|
|
|
SkDrawable* SK_WARN_UNUSED_RESULT endRecordingAsDrawable() {
|
|
|
|
return this->finishRecordingAsDrawable().release();
|
|
|
|
}
|
2015-04-09 13:12:17 +00:00
|
|
|
SkPicture* SK_WARN_UNUSED_RESULT endRecording() { return this->endRecordingAsPicture(); }
|
2016-03-18 14:25:55 +00:00
|
|
|
#endif
|
2014-04-18 18:04:41 +00:00
|
|
|
|
2016-08-01 20:17:47 +00:00
|
|
|
// Strawman API.
|
|
|
|
void optimizeFor(GrContext* ctx) { fGrContextToOptimizeFor = ctx; }
|
|
|
|
|
2014-04-18 18:04:41 +00:00
|
|
|
private:
|
2014-06-17 19:08:15 +00:00
|
|
|
void reset();
|
|
|
|
|
2014-05-27 23:41:45 +00:00
|
|
|
/** Replay the current (partially recorded) operation stream into
|
|
|
|
canvas. This call doesn't close the current recording.
|
|
|
|
*/
|
2014-06-17 20:42:59 +00:00
|
|
|
#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
|
|
|
|
friend class android::Picture;
|
|
|
|
#endif
|
2014-05-27 23:41:45 +00:00
|
|
|
friend class SkPictureRecorderReplayTester; // for unit testing
|
2014-05-29 15:57:11 +00:00
|
|
|
void partialReplay(SkCanvas* canvas) const;
|
2014-05-27 23:41:45 +00:00
|
|
|
|
2015-04-08 18:25:48 +00:00
|
|
|
bool fActivelyRecording;
|
2014-11-11 12:54:49 +00:00
|
|
|
uint32_t fFlags;
|
2014-11-19 16:04:34 +00:00
|
|
|
SkRect fCullRect;
|
2014-08-11 15:08:43 +00:00
|
|
|
SkAutoTUnref<SkBBoxHierarchy> fBBH;
|
2014-10-01 16:29:35 +00:00
|
|
|
SkAutoTUnref<SkRecorder> fRecorder;
|
2014-11-24 22:41:51 +00:00
|
|
|
SkAutoTUnref<SkRecord> fRecord;
|
2015-05-19 18:11:26 +00:00
|
|
|
SkMiniRecorder fMiniRecorder;
|
2014-04-18 18:04:41 +00:00
|
|
|
|
2016-08-01 20:17:47 +00:00
|
|
|
GrContext* fGrContextToOptimizeFor = nullptr;
|
|
|
|
|
2014-04-18 18:04:41 +00:00
|
|
|
typedef SkNoncopyable INHERITED;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|