| 1 | /* | 
|---|
| 2 | * Copyright 2013 Google Inc. | 
|---|
| 3 | * | 
|---|
| 4 | * Use of this source code is governed by a BSD-style license that can be | 
|---|
| 5 | * found in the LICENSE file. | 
|---|
| 6 | */ | 
|---|
| 7 |  | 
|---|
| 8 | #ifndef SkCanvasStateUtils_DEFINED | 
|---|
| 9 | #define SkCanvasStateUtils_DEFINED | 
|---|
| 10 |  | 
|---|
| 11 | #include "include/core/SkCanvas.h" | 
|---|
| 12 |  | 
|---|
| 13 | class SkCanvasState; | 
|---|
| 14 |  | 
|---|
| 15 | /** | 
|---|
| 16 | * A set of functions that are useful for copying the state of an SkCanvas | 
|---|
| 17 | * across a library boundary where the Skia library on the other side of the | 
|---|
| 18 | * boundary may be newer. The expected usage is outline below... | 
|---|
| 19 | * | 
|---|
| 20 | *                          Lib Boundary | 
|---|
| 21 | * CaptureCanvasState(...)      ||| | 
|---|
| 22 | *   SkCanvas --> SkCanvasState ||| | 
|---|
| 23 | *                              ||| CreateFromCanvasState(...) | 
|---|
| 24 | *                              |||   SkCanvasState --> SkCanvas` | 
|---|
| 25 | *                              ||| Draw into SkCanvas` | 
|---|
| 26 | *                              ||| Unref SkCanvas` | 
|---|
| 27 | * ReleaseCanvasState(...)      ||| | 
|---|
| 28 | * | 
|---|
| 29 | */ | 
|---|
| 30 | class SK_API SkCanvasStateUtils { | 
|---|
| 31 | public: | 
|---|
| 32 | /** | 
|---|
| 33 | * Captures the current state of the canvas into an opaque ptr that is safe | 
|---|
| 34 | * to pass to a different instance of Skia (which may be the same version, | 
|---|
| 35 | * or may be newer). The function will return NULL in the event that one of the | 
|---|
| 36 | * following conditions are true. | 
|---|
| 37 | *  1) the canvas device type is not supported (currently only raster is supported) | 
|---|
| 38 | *  2) the canvas clip type is not supported (currently only non-AA clips are supported) | 
|---|
| 39 | * | 
|---|
| 40 | * It is recommended that the original canvas also not be used until all | 
|---|
| 41 | * canvases that have been created using its captured state have been dereferenced. | 
|---|
| 42 | * | 
|---|
| 43 | * Finally, it is important to note that any draw filters attached to the | 
|---|
| 44 | * canvas are NOT currently captured. | 
|---|
| 45 | * | 
|---|
| 46 | * @param canvas The canvas you wish to capture the current state of. | 
|---|
| 47 | * @return NULL or an opaque ptr that can be passed to CreateFromCanvasState | 
|---|
| 48 | *         to reconstruct the canvas. The caller is responsible for calling | 
|---|
| 49 | *         ReleaseCanvasState to free the memory associated with this state. | 
|---|
| 50 | */ | 
|---|
| 51 | static SkCanvasState* CaptureCanvasState(SkCanvas* canvas); | 
|---|
| 52 |  | 
|---|
| 53 | /** | 
|---|
| 54 | * Create a new SkCanvas from the captured state of another SkCanvas. The | 
|---|
| 55 | * function will return NULL in the event that one of the | 
|---|
| 56 | * following conditions are true. | 
|---|
| 57 | *  1) the captured state is in an unrecognized format | 
|---|
| 58 | *  2) the captured canvas device type is not supported | 
|---|
| 59 | * | 
|---|
| 60 | * @param state Opaque object created by CaptureCanvasState. | 
|---|
| 61 | * @return NULL or an SkCanvas* whose devices and matrix/clip state are | 
|---|
| 62 | *         identical to the captured canvas. The caller is responsible for | 
|---|
| 63 | *         calling unref on the SkCanvas. | 
|---|
| 64 | */ | 
|---|
| 65 | static std::unique_ptr<SkCanvas> MakeFromCanvasState(const SkCanvasState* state); | 
|---|
| 66 |  | 
|---|
| 67 | /** | 
|---|
| 68 | * Free the memory associated with the captured canvas state.  The state | 
|---|
| 69 | * should not be released until all SkCanvas objects created using that | 
|---|
| 70 | * state have been dereferenced. Must be called from the same library | 
|---|
| 71 | * instance that created the state via CaptureCanvasState. | 
|---|
| 72 | * | 
|---|
| 73 | * @param state The captured state you wish to dispose of. | 
|---|
| 74 | */ | 
|---|
| 75 | static void ReleaseCanvasState(SkCanvasState* state); | 
|---|
| 76 | }; | 
|---|
| 77 |  | 
|---|
| 78 | #endif | 
|---|
| 79 |  | 
|---|