/*
* 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
#include "include/core/SkRect.h"
#include "include/core/SkRefCnt.h"
#include "include/core/SkScalar.h"
#include "include/private/base/SkAPI.h"
#include <memory>
#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
namespace android {
class Picture;
};
#endif
class SkBBHFactory;
class SkBBoxHierarchy;
class SkCanvas;
class SkDrawable;
class SkPicture;
class SkRecord;
class SkRecordCanvas;
class SK_API SkPictureRecorder {
public:
SkPictureRecorder();
~SkPictureRecorder();
/** Returns the canvas that records the drawing commands.
@ 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 .
@ param bbh optional acceleration structure
@ param recordFlags optional flags that control recording .
@ return the canvas .
*/
SkCanvas* beginRecording(const SkRect& bounds, sk_sp<SkBBoxHierarchy> bbh);
SkCanvas* beginRecording(const SkRect& bounds, SkBBHFactory* bbhFactory = nullptr);
SkCanvas* beginRecording(SkScalar width, SkScalar height,
SkBBHFactory* bbhFactory = nullptr) {
return this->beginRecording(SkRect::MakeWH(width, height), bbhFactory);
}
/** 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 ) .
*/
SkCanvas* getRecordingCanvas();
/**
* 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 .
*/
sk_sp<SkPicture> finishRecordingAsPicture();
/**
* 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
* finishRecordingAsPicture ( ) , 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 .
*/
sk_sp<SkPicture> finishRecordingAsPictureWithCull(const SkRect& cullRect);
/**
* 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 finishRecordingAsPicture ( ) , 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 - > makePictureSnapshot ( ) ) .
*/
sk_sp<SkDrawable> finishRecordingAsDrawable();
private :
void reset();
/** Replay the current (partially recorded) operation stream into
canvas . This call doesn ' t close the current recording .
*/
#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
friend class android::Picture;
#endif
friend class SkPictureRecorderReplayTester; // for unit testing
void partialReplay(SkCanvas* canvas) const ;
sk_sp<SkBBoxHierarchy> fBBH;
std::unique_ptr<SkRecordCanvas> fRecorder;
sk_sp<SkRecord> fRecord;
SkRect fCullRect;
bool fActivelyRecording;
SkPictureRecorder(SkPictureRecorder&&) = delete ;
SkPictureRecorder& operator =(SkPictureRecorder&&) = delete ;
};
#endif
Messung V0.5 in Prozent C=90 H=98 G=94
¤ Dauer der Verarbeitung: 0.7 Sekunden
¤
*© Formatika GbR, Deutschland