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