1
2/*
3 * Copyright 2013 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9#ifndef SkCanvasStack_DEFINED
10#define SkCanvasStack_DEFINED
11
12#include "SkNWayCanvas.h"
13#include "SkTArray.h"
14
15class SkCanvasStack : public SkNWayCanvas {
16public:
17    SkCanvasStack(int width, int height);
18    virtual ~SkCanvasStack();
19
20    void pushCanvas(SkCanvas* canvas, const SkIPoint& origin);
21    void removeAll() override;
22
23    /*
24     * The following add/remove canvas methods are overrides from SkNWayCanvas
25     * that do not make sense in the context of our CanvasStack, but since we
26     * can share most of the other implementation of NWay we override those
27     * methods to be no-ops.
28     */
29    void addCanvas(SkCanvas*) override { SkDEBUGFAIL("Invalid Op"); }
30    void removeCanvas(SkCanvas*) override { SkDEBUGFAIL("Invalid Op"); }
31
32protected:
33    void didSetMatrix(const SkMatrix&) override;
34
35    void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) override;
36    void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) override;
37    void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) override;
38    void onClipRegion(const SkRegion&, SkRegion::Op) override;
39
40private:
41    void clipToZOrderedBounds();
42
43    struct CanvasData {
44        SkIPoint origin;
45        SkRegion requiredClip;
46    };
47
48    SkTArray<CanvasData> fCanvasData;
49
50    typedef SkNWayCanvas INHERITED;
51};
52
53#endif
54