blob: 8d24e615e82cade05edbd00ff54f0945bf3ac36c [file] [log] [blame]
robertphillips7eacd772014-08-21 13:12:42 -07001/*
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,
mtkleine71cd542014-10-29 14:17:13 -070043 const SkMatrix* matrix = NULL,
robertphillips7eacd772014-08-21 13:12:42 -070044 const SkPaint* paint = NULL);
45
46 /**
47 * Perform all the previously added draws. This will reset the state
senorblanco772604c2015-01-28 11:01:06 -080048 * of this object. If flush is true, all canvases are flushed after
49 * draw.
robertphillips7eacd772014-08-21 13:12:42 -070050 */
senorblanco772604c2015-01-28 11:01:06 -080051 void draw(bool flush = false);
robertphillips7eacd772014-08-21 13:12:42 -070052
53 /**
54 * Abandon all buffered draws and reset to the initial state.
55 */
56 void reset();
57
58private:
59 struct DrawData {
reed89889b62014-10-29 12:36:45 -070060 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>&);
robertphillips7eacd772014-08-21 13:12:42 -070069 };
70
reed89889b62014-10-29 12:36:45 -070071 SkTDArray<DrawData> fThreadSafeDrawData;
72 SkTDArray<DrawData> fGPUDrawData;
robertphillips7eacd772014-08-21 13:12:42 -070073};
74
75#endif