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