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