180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2007 The Android Open Source Project
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SkPicture_DEFINED
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkPicture_DEFINED
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#include "SkBitmap.h"
1458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "SkImageDecoder.h"
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkRefCnt.h"
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
17363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass SkBBoxHierarchy;
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkCanvas;
197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerclass SkDrawPictureCallback;
207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerclass SkData;
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkPicturePlayback;
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkPictureRecord;
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkStream;
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkWStream;
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstruct SkPictInfo;
2758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** \class SkPicture
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    The SkPicture class records the drawing commands made to a canvas, to
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    be played back at a later time.
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru*/
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SK_API SkPicture : public SkRefCnt {
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_DECLARE_INST_COUNT(SkPicture)
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    /** The constructor prepares the picture to record.
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        @param width the width of the virtual device the picture records.
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        @param height the height of the virtual device the picture records.
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    */
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPicture();
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    /** Make a copy of the contents of src. If src records more drawing after
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        this call, those elements will not appear in this picture.
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    */
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPicture(const SkPicture& src);
46096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
47096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    /**
48096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     *  Function signature defining a function that sets up an SkBitmap from encoded data. On
49096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     *  success, the SkBitmap should have its Config, width, height, rowBytes and pixelref set.
50096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     *  If the installed pixelref has decoded the data into pixels, then the src buffer need not be
51096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     *  copied. If the pixelref defers the actual decode until its lockPixels() is called, then it
52096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     *  must make a copy of the src buffer.
53096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     *  @param src Encoded data.
54096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     *  @param length Size of the encoded data, in bytes.
55096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     *  @param dst SkBitmap to install the pixel ref on.
56096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     *  @param bool Whether or not a pixel ref was successfully installed.
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     */
58096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    typedef bool (*InstallPixelRefProc)(const void* src, size_t length, SkBitmap* dst);
59096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
60096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    /**
61096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     *  Recreate a picture that was serialized into a stream.
62096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     *  @param SkStream Serialized picture data.
63096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     *  @param proc Function pointer for installing pixelrefs on SkBitmaps representing the
64096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     *              encoded bitmap data from the stream.
6558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *  @return A new SkPicture representing the serialized data, or NULL if the stream is
6658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     *          invalid.
67096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     */
6858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    static SkPicture* CreateFromStream(SkStream*,
6958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                                       InstallPixelRefProc proc = &SkImageDecoder::DecodeMemory);
70096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual ~SkPicture();
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    /**
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     *  Swap the contents of the two pictures. Guaranteed to succeed.
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     */
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void swap(SkPicture& other);
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    /**
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     *  Creates a thread-safe clone of the picture that is ready for playback.
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     */
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPicture* clone() const;
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    /**
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     * Creates multiple thread-safe clones of this picture that are ready for
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     * playback. The resulting clones are stored in the provided array of
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     * SkPictures.
8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     */
8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void clone(SkPicture* pictures, int count) const;
8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    enum RecordingFlags {
9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        /*  This flag specifies that when clipPath() is called, the path will
9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            be faithfully recorded, but the recording canvas' current clip will
9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            only see the path's bounds. This speeds up the recording process
9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            without compromising the fidelity of the playback. The only side-
9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            effect for recording is that calling getTotalClip() or related
9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            clip-query calls will reflect the path's bounds, not the actual
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            path.
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru         */
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        kUsePathBoundsForClip_RecordingFlag = 0x01,
10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        /*  This flag causes the picture to compute bounding boxes and build
10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            up a spatial hierarchy (currently an R-Tree), plus a tree of Canvas'
10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            usually stack-based clip/etc state. This requires an increase in
10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            recording time (often ~2x; likely more for very complex pictures),
10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            but allows us to perform much faster culling at playback time, and
10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            completely avoid some unnecessary clips and other operations. This
10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            is ideal for tiled rendering, or any other situation where you're
10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            drawing a fraction of a large scene into a smaller viewport.
10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            In most cases the record cost is offset by the playback improvement
11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            after a frame or two of tiled rendering (and complex pictures that
11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            induce the worst record times will generally get the largest
11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            speedups at playback time).
11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            Note: Currently this is not serializable, the bounding data will be
11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            discarded if you serialize into a stream and then deserialize.
11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        */
1177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        kOptimizeForClippedPlayback_RecordingFlag = 0x02,
1187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        /*
1197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            This flag disables all the picture recording optimizations (i.e.,
1207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            those in SkPictureRecord). It is mainly intended for testing the
1217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            existing optimizations (i.e., to actually have the pattern
1227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            appear in an .skp we have to disable the optimization). This
1237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            option doesn't affect the optimizations controlled by
1247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            'kOptimizeForClippedPlayback_RecordingFlag'.
1257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger         */
1267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        kDisableRecordOptimizations_RecordingFlag = 0x04
12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    };
12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    /** Returns the canvas that records the drawing commands.
13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        @param width the base width for the picture, as if the recording
13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                     canvas' bitmap had this width.
13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        @param height the base width for the picture, as if the recording
13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                     canvas' bitmap had this height.
13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        @param recordFlags optional flags that control recording.
13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        @return the picture canvas.
13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    */
13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkCanvas* beginRecording(int width, int height, uint32_t recordFlags = 0);
13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    /** Returns the recording canvas if one is active, or NULL if recording is
14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        not active. This does not alter the refcnt on the canvas (if present).
14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    */
14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkCanvas* getRecordingCanvas() const;
14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    /** Signal that the caller is done recording. This invalidates the canvas
14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        returned by beginRecording/getRecordingCanvas, and prepares the picture
14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        for drawing. Note: this happens implicitly the first time the picture
14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        is drawn.
14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    */
14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void endRecording();
14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    /** Replays the drawing commands on the specified canvas. This internally
15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        calls endRecording() if that has not already been called.
1527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        @param canvas the canvas receiving the drawing commands.
15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    */
1547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    void draw(SkCanvas* canvas, SkDrawPictureCallback* = NULL);
15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    /** Return the width of the picture's recording canvas. This
15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        value reflects what was passed to setSize(), and does not necessarily
15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        reflect the bounds of what has been recorded into the picture.
15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        @return the width of the picture's recording canvas
16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    */
16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int width() const { return fWidth; }
16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    /** Return the height of the picture's recording canvas. This
16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        value reflects what was passed to setSize(), and does not necessarily
16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        reflect the bounds of what has been recorded into the picture.
16680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        @return the height of the picture's recording canvas
16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    */
16880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int height() const { return fHeight; }
16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    /**
1717839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  Function to encode an SkBitmap to an SkData. A function with this
1727839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  signature can be passed to serialize() and SkOrderedWriteBuffer.
1737839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  Returning NULL will tell the SkOrderedWriteBuffer to use
1747839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  SkBitmap::flatten() to store the bitmap.
1757839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  @param pixelRefOffset Output parameter, telling the deserializer what
1767839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *      offset in the bm's pixelRef corresponds to the encoded data.
1777839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  @return SkData If non-NULL, holds encoded data representing the passed
1787839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *      in bitmap. The caller is responsible for calling unref().
179096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     */
1807839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    typedef SkData* (*EncodeBitmap)(size_t* pixelRefOffset, const SkBitmap& bm);
181096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
182096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    /**
18380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     *  Serialize to a stream. If non NULL, encoder will be used to encode
18480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     *  any bitmaps in the picture.
1857839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  encoder will never be called with a NULL pixelRefOffset.
18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru     */
187096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    void serialize(SkWStream*, EncodeBitmap encoder = NULL) const;
18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1890a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    /**
1900a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger     * Returns true if any bitmaps may be produced when this SkPicture
1910a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger     * is replayed.
1920a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger     * Returns false if called while still recording.
1930a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger     */
1940a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    bool willPlayBackBitmaps() const;
1950a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
196d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger#ifdef SK_BUILD_FOR_ANDROID
19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    /** Signals that the caller is prematurely done replaying the drawing
19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        commands. This can be called from a canvas virtual while the picture
19980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        is drawing. Has no effect if the picture is not drawing.
200d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        @deprecated preserving for legacy purposes
20180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    */
20280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void abortPlayback();
203d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger#endif
20480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
205363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprotected:
206363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    // V2 : adds SkPixelRef's generation ID.
207363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    // V3 : PictInfo tag at beginning, and EOF tag at the end
208363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    // V4 : move SkPictInfo to be the header
209363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    // V5 : don't read/write FunctionPtr on cross-process (we can detect that)
210363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    // V6 : added serialization of SkPath's bounds (and packed its flags tighter)
211363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    // V7 : changed drawBitmapRect(IRect) to drawBitmapRectToRect(Rect)
212363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    // V8 : Add an option for encoding bitmaps
213363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    // V9 : Allow the reader and writer of an SKP disagree on whether to support
214363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    //      SK_SUPPORT_HINTING_SCALE_FACTOR
215363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    // V10: add drawRRect, drawOval, clipRRect
2167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    // V11: modify how readBitmap and writeBitmap store their info.
21758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    // V12: add conics to SkPath, use new SkPathRef flattening
2180a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    // V13: add flag to drawBitmapRectToRect
2190a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    //      parameterize blurs by sigma rather than radius
2200a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    // V14: Add flags word to PathRef serialization
221910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    // V15: Remove A1 bitmpa config (and renumber remaining configs)
222910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    // V16: Move SkPath's isOval flag to SkPathRef
223910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    // V17: SkPixelRef now writes SkImageInfo
224910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger#ifndef DELETE_THIS_CODE_WHEN_SKPS_ARE_REBUILT_AT_V16_AND_ALL_OTHER_INSTANCES_TOO
225910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    static const uint32_t PRIOR_PICTURE_VERSION = 15;  // TODO: remove when .skps regenerated
2260a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#endif
227910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    static const uint32_t PICTURE_VERSION = 17;
228363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
229363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    // fPlayback, fRecord, fWidth & fHeight are protected to allow derived classes to
230363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    // install their own SkPicturePlayback-derived players,SkPictureRecord-derived
231363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    // recorders and set the picture size
23280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPicturePlayback* fPlayback;
233363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    SkPictureRecord* fRecord;
234363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    int fWidth, fHeight;
23580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
23658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    // Create a new SkPicture from an existing SkPicturePlayback. Ref count of
23758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    // playback is unchanged.
23858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkPicture(SkPicturePlayback*, int width, int height);
23958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
240363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    // For testing. Derived classes may instantiate an alternate
241363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    // SkBBoxHierarchy implementation
242363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    virtual SkBBoxHierarchy* createBBoxHierarchy() const;
243363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
24458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    // Return true if the SkStream represents a serialized picture, and fills out
24558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    // SkPictInfo. After this function returns, the SkStream is not rewound; it
24658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    // will be ready to be parsed to create an SkPicturePlayback.
24758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    // If false is returned, SkPictInfo is unmodified.
24858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    static bool StreamIsSKP(SkStream*, SkPictInfo*);
249363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprivate:
25080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    friend class SkFlatPicture;
25180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    friend class SkPicturePlayback;
25280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
25380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef SkRefCnt INHERITED;
25480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
25580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2567839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger/**
2577839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger *  Subclasses of this can be passed to canvas.drawPicture. During the drawing
2587839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger *  of the picture, this callback will periodically be invoked. If its
2597839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger *  abortDrawing() returns true, then picture playback will be interrupted.
2607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger *
2617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger *  The resulting drawing is undefined, as there is no guarantee how often the
2627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger *  callback will be invoked. If the abort happens inside some level of nested
2637839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger *  calls to save(), restore will automatically be called to return the state
2647839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger *  to the same level it was before the drawPicture call was made.
2657839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger */
266779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenbergerclass SK_API SkDrawPictureCallback {
2677839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerpublic:
2687839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkDrawPictureCallback() {}
2697839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual ~SkDrawPictureCallback() {}
2707839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2717839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual bool abortDrawing() = 0;
2727839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger};
27380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
27480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
275