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