1 /* 2 * Copyright 2014 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 SkMultiPictureDraw_DEFINED 9 #define SkMultiPictureDraw_DEFINED 10 11 #include "SkMatrix.h" 12 #include "SkTDArray.h" 13 14 class SkCanvas; 15 class SkPaint; 16 class SkPicture; 17 18 /** \class SkMultiPictureDraw 19 20 The MultiPictureDraw object accepts several picture/canvas pairs and 21 then attempts to optimally draw the pictures into the canvases, sharing 22 as many resources as possible. 23 */ 24 class SK_API SkMultiPictureDraw { 25 public: 26 /** 27 * Create an object to optimize the drawing of multiple pictures. 28 * @param reserve Hint for the number of add calls expected to be issued 29 */ 30 SkMultiPictureDraw(int reserve = 0); 31 ~SkMultiPictureDraw() { this->reset(); } 32 33 /** 34 * Add a canvas/picture pair for later rendering. 35 * @param canvas the canvas in which to draw picture 36 * @param picture the picture to draw into canvas 37 * @param matrix if non-NULL, applied to the CTM when drawing 38 * @param paint if non-NULL, draw picture to a temporary buffer 39 * and then apply the paint when the result is drawn 40 */ 41 void add(SkCanvas* canvas, 42 const SkPicture* picture, 43 const SkMatrix* matrix = NULL, 44 const SkPaint* paint = NULL); 45 46 /** 47 * Perform all the previously added draws. This will reset the state 48 * of this object. If flush is true, all canvases are flushed after 49 * draw. 50 */ 51 void draw(bool flush = false); 52 53 /** 54 * Abandon all buffered draws and reset to the initial state. 55 */ 56 void reset(); 57 58 private: 59 struct DrawData { 60 SkCanvas* fCanvas; // reffed 61 const SkPicture* fPicture; // reffed 62 SkMatrix fMatrix; 63 SkPaint* fPaint; // owned 64 65 void init(SkCanvas*, const SkPicture*, const SkMatrix*, const SkPaint*); 66 void draw(); 67 68 static void Reset(SkTDArray<DrawData>&); 69 70 static void Draw(DrawData* d) { d->draw(); } 71 }; 72 73 SkTDArray<DrawData> fThreadSafeDrawData; 74 SkTDArray<DrawData> fGPUDrawData; 75 }; 76 77 #endif 78