1/*
2 * Copyright 2013 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 SkCanvasStack_DEFINED
9#define SkCanvasStack_DEFINED
10
11#include "SkNWayCanvas.h"
12#include "SkRegion.h"
13#include "SkTArray.h"
14
15/**
16 *  Like NWayCanvas, in that it forwards all canvas methods to each sub-canvas that is "pushed".
17 *
18 *  Unlike NWayCanvas, this takes ownership of each subcanvas, and deletes them when this canvas
19 *  is deleted.
20 */
21class SkCanvasStack : public SkNWayCanvas {
22public:
23    SkCanvasStack(int width, int height);
24    ~SkCanvasStack() override;
25
26    void pushCanvas(std::unique_ptr<SkCanvas>, const SkIPoint& origin);
27    void removeAll() override;
28
29    /*
30     * The following add/remove canvas methods are overrides from SkNWayCanvas
31     * that do not make sense in the context of our CanvasStack, but since we
32     * can share most of the other implementation of NWay we override those
33     * methods to be no-ops.
34     */
35    void addCanvas(SkCanvas*) override { SkDEBUGFAIL("Invalid Op"); }
36    void removeCanvas(SkCanvas*) override { SkDEBUGFAIL("Invalid Op"); }
37
38protected:
39    void didSetMatrix(const SkMatrix&) override;
40
41    void onClipRect(const SkRect&, SkClipOp, ClipEdgeStyle) override;
42    void onClipRRect(const SkRRect&, SkClipOp, ClipEdgeStyle) override;
43    void onClipPath(const SkPath&, SkClipOp, ClipEdgeStyle) override;
44    void onClipRegion(const SkRegion&, SkClipOp) override;
45
46private:
47    void clipToZOrderedBounds();
48
49    struct CanvasData {
50        SkIPoint origin;
51        SkRegion requiredClip;
52        std::unique_ptr<SkCanvas> ownedCanvas;
53    };
54
55    SkTArray<CanvasData> fCanvasData;
56
57    typedef SkNWayCanvas INHERITED;
58};
59
60#endif
61