SkMultiPictureDraw.h revision e71cd54ed4d83310d718490d40643c35b622b9f5
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 14class SkCanvas; 15class SkPaint; 16class 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*/ 24class SK_API SkMultiPictureDraw { 25public: 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. 49 */ 50 void draw(); 51 52 /** 53 * Abandon all buffered draws and reset to the initial state. 54 */ 55 void reset(); 56 57private: 58 struct DrawData { 59 SkCanvas* fCanvas; // reffed 60 const SkPicture* fPicture; // reffed 61 SkMatrix fMatrix; 62 SkPaint* fPaint; // owned 63 64 void init(SkCanvas*, const SkPicture*, const SkMatrix*, const SkPaint*); 65 void draw(); 66 67 static void Reset(SkTDArray<DrawData>&); 68 69 static void Draw(DrawData* d) { d->draw(); } 70 }; 71 72 SkTDArray<DrawData> fThreadSafeDrawData; 73 SkTDArray<DrawData> fGPUDrawData; 74}; 75 76#endif 77