2011-07-28 14:26:00 +00:00
|
|
|
|
2008-12-17 15:59:43 +00:00
|
|
|
/*
|
2011-07-28 14:26:00 +00:00
|
|
|
* Copyright 2007 The Android Open Source Project
|
2008-12-17 15:59:43 +00:00
|
|
|
*
|
2011-07-28 14:26:00 +00:00
|
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
|
|
* found in the LICENSE file.
|
2008-12-17 15:59:43 +00:00
|
|
|
*/
|
|
|
|
|
2011-07-28 14:26:00 +00:00
|
|
|
|
2008-12-17 15:59:43 +00:00
|
|
|
#ifndef SkPicture_DEFINED
|
|
|
|
#define SkPicture_DEFINED
|
|
|
|
|
|
|
|
#include "SkRefCnt.h"
|
|
|
|
|
2012-06-01 21:23:07 +00:00
|
|
|
class SkBitmap;
|
2008-12-17 15:59:43 +00:00
|
|
|
class SkCanvas;
|
|
|
|
class SkPicturePlayback;
|
|
|
|
class SkPictureRecord;
|
|
|
|
class SkStream;
|
|
|
|
class SkWStream;
|
|
|
|
|
|
|
|
/** \class SkPicture
|
|
|
|
|
|
|
|
The SkPicture class records the drawing commands made to a canvas, to
|
|
|
|
be played back at a later time.
|
|
|
|
*/
|
2011-04-25 20:02:38 +00:00
|
|
|
class SK_API SkPicture : public SkRefCnt {
|
2008-12-17 15:59:43 +00:00
|
|
|
public:
|
2012-06-21 20:25:03 +00:00
|
|
|
SK_DECLARE_INST_COUNT(SkPicture)
|
|
|
|
|
2008-12-17 15:59:43 +00:00
|
|
|
/** The constructor prepares the picture to record.
|
|
|
|
@param width the width of the virtual device the picture records.
|
|
|
|
@param height the height of the virtual device the picture records.
|
|
|
|
*/
|
|
|
|
SkPicture();
|
|
|
|
/** Make a copy of the contents of src. If src records more drawing after
|
|
|
|
this call, those elements will not appear in this picture.
|
|
|
|
*/
|
|
|
|
SkPicture(const SkPicture& src);
|
2012-06-25 14:36:28 +00:00
|
|
|
/**
|
|
|
|
* Recreate a picture that was serialized into a stream. If an error occurs
|
|
|
|
* the picture will be "empty" : width and height == 0
|
|
|
|
*/
|
2008-12-17 15:59:43 +00:00
|
|
|
explicit SkPicture(SkStream*);
|
|
|
|
virtual ~SkPicture();
|
2012-08-23 18:09:54 +00:00
|
|
|
|
2008-12-17 15:59:43 +00:00
|
|
|
/**
|
|
|
|
* Swap the contents of the two pictures. Guaranteed to succeed.
|
|
|
|
*/
|
|
|
|
void swap(SkPicture& other);
|
2012-08-30 14:38:00 +00:00
|
|
|
|
2012-08-29 18:52:07 +00:00
|
|
|
/**
|
|
|
|
* Creates a thread-safe clone of the picture that is ready for playback.
|
|
|
|
*/
|
|
|
|
SkPicture* clone() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates multiple thread-safe clones of this picture that are ready for
|
|
|
|
* playback. The resulting clones are stored in the provided array of
|
|
|
|
* SkPictures.
|
|
|
|
*/
|
|
|
|
void clone(SkPicture* pictures, int count) const;
|
2012-08-23 18:09:54 +00:00
|
|
|
|
2009-02-13 14:56:09 +00:00
|
|
|
enum RecordingFlags {
|
|
|
|
/* This flag specifies that when clipPath() is called, the path will
|
|
|
|
be faithfully recorded, but the recording canvas' current clip will
|
|
|
|
only see the path's bounds. This speeds up the recording process
|
|
|
|
without compromising the fidelity of the playback. The only side-
|
|
|
|
effect for recording is that calling getTotalClip() or related
|
|
|
|
clip-query calls will reflect the path's bounds, not the actual
|
|
|
|
path.
|
|
|
|
*/
|
2012-09-13 21:41:51 +00:00
|
|
|
kUsePathBoundsForClip_RecordingFlag = 0x01,
|
|
|
|
/* This flag causes the picture to compute bounding boxes and build
|
|
|
|
up a spatial hierarchy (currently an R-Tree), plus a tree of Canvas'
|
|
|
|
usually stack-based clip/etc state. This requires an increase in
|
|
|
|
recording time (often ~2x; likely more for very complex pictures),
|
|
|
|
but allows us to perform much faster culling at playback time, and
|
|
|
|
completely avoid some unnecessary clips and other operations. This
|
|
|
|
is ideal for tiled rendering, or any other situation where you're
|
2012-09-14 02:01:10 +00:00
|
|
|
drawing a fraction of a large scene into a smaller viewport.
|
2012-09-13 21:41:51 +00:00
|
|
|
|
|
|
|
In most cases the record cost is offset by the playback improvement
|
|
|
|
after a frame or two of tiled rendering (and complex pictures that
|
|
|
|
induce the worst record times will generally get the largest
|
|
|
|
speedups at playback time).
|
|
|
|
|
|
|
|
Note: Currently this is not serializable, the bounding data will be
|
|
|
|
discarded if you serialize into a stream and then deserialize.
|
|
|
|
*/
|
|
|
|
kOptimizeForClippedPlayback_RecordingFlag = 0x02
|
2009-02-13 14:56:09 +00:00
|
|
|
};
|
|
|
|
|
2008-12-17 15:59:43 +00:00
|
|
|
/** Returns the canvas that records the drawing commands.
|
2009-02-13 14:56:09 +00:00
|
|
|
@param width the base width for the picture, as if the recording
|
|
|
|
canvas' bitmap had this width.
|
|
|
|
@param height the base width for the picture, as if the recording
|
|
|
|
canvas' bitmap had this height.
|
|
|
|
@param recordFlags optional flags that control recording.
|
2008-12-17 15:59:43 +00:00
|
|
|
@return the picture canvas.
|
|
|
|
*/
|
2009-02-13 14:56:09 +00:00
|
|
|
SkCanvas* beginRecording(int width, int height, uint32_t recordFlags = 0);
|
|
|
|
|
2008-12-17 15:59:43 +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).
|
|
|
|
*/
|
|
|
|
SkCanvas* getRecordingCanvas() const;
|
|
|
|
/** Signal that the caller is done recording. This invalidates the canvas
|
|
|
|
returned by beginRecording/getRecordingCanvas, and prepares the picture
|
|
|
|
for drawing. Note: this happens implicitly the first time the picture
|
|
|
|
is drawn.
|
|
|
|
*/
|
|
|
|
void endRecording();
|
2012-06-01 21:23:07 +00:00
|
|
|
|
|
|
|
/** Returns true if any draw commands have been recorded since the last
|
|
|
|
call to beginRecording.
|
|
|
|
*/
|
|
|
|
bool hasRecorded() const;
|
|
|
|
|
2008-12-17 15:59:43 +00:00
|
|
|
/** Replays the drawing commands on the specified canvas. This internally
|
|
|
|
calls endRecording() if that has not already been called.
|
|
|
|
@param surface the canvas receiving the drawing commands.
|
|
|
|
*/
|
|
|
|
void draw(SkCanvas* surface);
|
2012-08-23 18:09:54 +00:00
|
|
|
|
2008-12-17 15:59:43 +00:00
|
|
|
/** Return the width of the picture's recording canvas. This
|
|
|
|
value reflects what was passed to setSize(), and does not necessarily
|
|
|
|
reflect the bounds of what has been recorded into the picture.
|
|
|
|
@return the width of the picture's recording canvas
|
|
|
|
*/
|
|
|
|
int width() const { return fWidth; }
|
|
|
|
|
|
|
|
/** Return the height of the picture's recording canvas. This
|
|
|
|
value reflects what was passed to setSize(), and does not necessarily
|
|
|
|
reflect the bounds of what has been recorded into the picture.
|
|
|
|
@return the height of the picture's recording canvas
|
|
|
|
*/
|
|
|
|
int height() const { return fHeight; }
|
|
|
|
|
|
|
|
void serialize(SkWStream*) const;
|
|
|
|
|
|
|
|
/** Signals that the caller is prematurely done replaying the drawing
|
|
|
|
commands. This can be called from a canvas virtual while the picture
|
2012-08-23 18:09:54 +00:00
|
|
|
is drawing. Has no effect if the picture is not drawing.
|
2008-12-17 15:59:43 +00:00
|
|
|
*/
|
|
|
|
void abortPlayback();
|
2012-08-23 18:09:54 +00:00
|
|
|
|
2008-12-17 15:59:43 +00:00
|
|
|
private:
|
|
|
|
int fWidth, fHeight;
|
|
|
|
SkPictureRecord* fRecord;
|
|
|
|
SkPicturePlayback* fPlayback;
|
|
|
|
|
|
|
|
friend class SkFlatPicture;
|
|
|
|
friend class SkPicturePlayback;
|
2012-06-21 20:25:03 +00:00
|
|
|
|
|
|
|
typedef SkRefCnt INHERITED;
|
2008-12-17 15:59:43 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class SkAutoPictureRecord : SkNoncopyable {
|
|
|
|
public:
|
2009-02-13 14:56:09 +00:00
|
|
|
SkAutoPictureRecord(SkPicture* pict, int width, int height,
|
|
|
|
uint32_t recordingFlags = 0) {
|
2008-12-17 15:59:43 +00:00
|
|
|
fPicture = pict;
|
2009-02-13 14:56:09 +00:00
|
|
|
fCanvas = pict->beginRecording(width, height, recordingFlags);
|
2008-12-17 15:59:43 +00:00
|
|
|
}
|
|
|
|
~SkAutoPictureRecord() {
|
|
|
|
fPicture->endRecording();
|
|
|
|
}
|
2012-08-23 18:09:54 +00:00
|
|
|
|
2008-12-17 15:59:43 +00:00
|
|
|
/** Return the canvas to draw into for recording into the picture.
|
|
|
|
*/
|
|
|
|
SkCanvas* getRecordingCanvas() const { return fCanvas; }
|
2012-08-23 18:09:54 +00:00
|
|
|
|
2008-12-17 15:59:43 +00:00
|
|
|
private:
|
|
|
|
SkPicture* fPicture;
|
|
|
|
SkCanvas* fCanvas;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|