1/*
2 * Copyright 2010 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 GrClip_DEFINED
9#define GrClip_DEFINED
10
11#include "SkClipStack.h"
12#include "GrSurface.h"
13
14struct SkIRect;
15
16/**
17 * GrClipData encapsulates the information required to construct the clip
18 * masks. 'fOrigin' is only non-zero when saveLayer has been called
19 * with an offset bounding box. The clips in 'fClipStack' are in
20 * device coordinates (i.e., they have been translated by -fOrigin w.r.t.
21 * the canvas' device coordinates).
22 */
23class GrClipData : SkNoncopyable {
24public:
25    const SkClipStack*  fClipStack;
26    SkIPoint            fOrigin;
27
28    GrClipData()
29        : fClipStack(NULL) {
30        fOrigin.setZero();
31    }
32
33    bool operator==(const GrClipData& other) const {
34        if (fOrigin != other.fOrigin) {
35            return false;
36        }
37
38        if (fClipStack && other.fClipStack) {
39            return *fClipStack == *other.fClipStack;
40        }
41
42        return fClipStack == other.fClipStack;
43    }
44
45    bool operator!=(const GrClipData& other) const {
46        return !(*this == other);
47    }
48
49    void getConservativeBounds(const GrSurface* surface,
50                               SkIRect* devResult,
51                               bool* isIntersectionOfRects = NULL) const {
52        this->getConservativeBounds(surface->width(), surface->height(),
53                                    devResult, isIntersectionOfRects);
54    }
55
56    void getConservativeBounds(int width, int height,
57                               SkIRect* devResult,
58                               bool* isIntersectionOfRects = NULL) const;
59};
60
61#endif
62