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    virtual void removeAll() SK_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    virtual void addCanvas(SkCanvas*) SK_OVERRIDE { SkDEBUGFAIL("Invalid Op"); }
30    virtual void removeCanvas(SkCanvas*) SK_OVERRIDE { SkDEBUGFAIL("Invalid Op"); }
31
32protected:
33    virtual void didSetMatrix(const SkMatrix&) SK_OVERRIDE;
34
35    virtual void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
36    virtual void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
37    virtual void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
38    virtual void onClipRegion(const SkRegion&, SkRegion::Op) SK_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