/*
 * Copyright 2014 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SkMultiPictureDraw_DEFINED
#define SkMultiPictureDraw_DEFINED

#include "SkMatrix.h"
#include "SkTDArray.h"

class SkCanvas;
class SkPaint;
class SkPicture;

/** \class SkMultiPictureDraw

    The MultiPictureDraw object accepts several picture/canvas pairs and
    then attempts to optimally draw the pictures into the canvases, sharing
    as many resources as possible.
*/
class SK_API SkMultiPictureDraw {
public:
    /**
     *  Create an object to optimize the drawing of multiple pictures.
     *  @param reserve Hint for the number of add calls expected to be issued
     */
    SkMultiPictureDraw(int reserve = 0);
    ~SkMultiPictureDraw() { this->reset(); }

    /**
     *  Add a canvas/picture pair for later rendering.
     *  @param canvas   the canvas in which to draw picture
     *  @param picture  the picture to draw into canvas
     *  @param matrix   if non-NULL, applied to the CTM when drawing
     *  @param paint    if non-NULL, draw picture to a temporary buffer
     *                  and then apply the paint when the result is drawn
     */
    void add(SkCanvas* canvas,
             const SkPicture* picture,
             const SkMatrix* matrix = NULL,
             const SkPaint* paint = NULL);

    /**
     *  Perform all the previously added draws. This will reset the state
     *  of this object.
     */
    void draw();

    /**
     *  Abandon all buffered draws and reset to the initial state.
     */
    void reset();

private:
    struct DrawData {
        SkCanvas*        fCanvas;  // reffed
        const SkPicture* fPicture; // reffed
        SkMatrix         fMatrix;
        SkPaint*         fPaint;   // owned

        void init(SkCanvas*, const SkPicture*, const SkMatrix*, const SkPaint*);
        void draw();

        static void Reset(SkTDArray<DrawData>&);

        static void Draw(DrawData* d) { d->draw(); }
    };

    SkTDArray<DrawData> fThreadSafeDrawData;
    SkTDArray<DrawData> fGPUDrawData;
};

#endif
