1f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger/*
2f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Copyright 2010 Google Inc.
3f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger *
4f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
5f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * found in the LICENSE file.
6f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */
7f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
8f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifndef SkRasterClip_DEFINED
9f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define SkRasterClip_DEFINED
10f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
11f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkRegion.h"
12f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkAAClip.h"
13f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
14f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerclass SkRasterClip {
15f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic:
16f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkRasterClip();
17f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkRasterClip(const SkIRect&);
18f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkRasterClip(const SkRasterClip&);
19f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    ~SkRasterClip();
20f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
21f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool isBW() const { return fIsBW; }
22f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool isAA() const { return !fIsBW; }
23f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    const SkRegion& bwRgn() const { SkASSERT(fIsBW); return fBW; }
24f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    const SkAAClip& aaRgn() const { SkASSERT(!fIsBW); return fAA; }
25f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
26f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool isEmpty() const;
27f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool isRect() const;
28f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool isComplex() const;
29f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    const SkIRect& getBounds() const;
30f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
31f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool setEmpty();
32f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool setRect(const SkIRect&);
33f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
34f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool setPath(const SkPath& path, const SkRegion& clip, bool doAA);
35f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool setPath(const SkPath& path, const SkIRect& clip, bool doAA);
36f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool setPath(const SkPath& path, const SkRasterClip&, bool doAA);
37f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
38f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool op(const SkIRect&, SkRegion::Op);
39f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool op(const SkRegion&, SkRegion::Op);
40f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool op(const SkRasterClip&, SkRegion::Op);
41f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool op(const SkRect&, SkRegion::Op, bool doAA);
42f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
43f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    void translate(int dx, int dy, SkRasterClip* dst) const;
44f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    void translate(int dx, int dy) {
45f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        this->translate(dx, dy, this);
46f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
47f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
48f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool quickContains(const SkIRect& rect) const;
49f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool quickContains(int left, int top, int right, int bottom) const {
50f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return quickContains(SkIRect::MakeLTRB(left, top, right, bottom));
51f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
52f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
53f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    /**
54f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger     *  Return true if this region is empty, or if the specified rectangle does
55f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger     *  not intersect the region. Returning false is not a guarantee that they
56f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger     *  intersect, but returning true is a guarantee that they do not.
57f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger     */
58f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool quickReject(const SkIRect& rect) const {
59f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return this->isEmpty() || rect.isEmpty() ||
60f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger               !SkIRect::Intersects(this->getBounds(), rect);
61f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
62f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
63f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    // hack for SkCanvas::getTotalClip
64f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    const SkRegion& forceGetBW();
65f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
66f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifdef SK_DEBUG
67f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    void validate() const;
68f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#else
69f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    void validate() const {}
70f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif
71f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
72f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerprivate:
73f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkRegion    fBW;
74f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkAAClip    fAA;
75f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool        fIsBW;
76f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
77f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    void convertToAA();
78f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger};
79f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
80f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerclass SkAutoRasterClipValidate : SkNoncopyable {
81f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic:
82f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkAutoRasterClipValidate(const SkRasterClip& rc) : fRC(rc) {
83f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        fRC.validate();
84f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
85f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    ~SkAutoRasterClipValidate() {
86f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        fRC.validate();
87f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
88f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerprivate:
89f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    const SkRasterClip& fRC;
90f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger};
91f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
92f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifdef SK_DEBUG
93f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    #define AUTO_RASTERCLIP_VALIDATE(rc)    SkAutoRasterClipValidate arcv(rc)
94f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#else
95f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    #define AUTO_RASTERCLIP_VALIDATE(rc)
96f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif
97f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
98f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
99f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
100f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger/**
101f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger *  Encapsulates the logic of deciding if we need to change/wrap the blitter
102f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger *  for aaclipping. If so, getRgn and getBlitter return modified values. If
103f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger *  not, they return the raw blitter and (bw) clip region.
104f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger *
105f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger *  We need to keep the constructor/destructor cost as small as possible, so we
106f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger *  can freely put this guy on the stack, and not pay too much for the case when
107f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger *  we're really BW anyways.
108f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */
109f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerclass SkAAClipBlitterWrapper {
110f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic:
111f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkAAClipBlitterWrapper();
112f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkAAClipBlitterWrapper(const SkRasterClip&, SkBlitter*);
113f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkAAClipBlitterWrapper(const SkAAClip*, SkBlitter*);
114f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
115f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    void init(const SkRasterClip&, SkBlitter*);
116f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
117f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    const SkIRect& getBounds() const {
118f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        SkASSERT(fClipRgn);
119f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return fClipRgn->getBounds();
120f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
121f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    const SkRegion& getRgn() const {
122f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        SkASSERT(fClipRgn);
123f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return *fClipRgn;
124f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
125f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkBlitter* getBlitter() {
126f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        SkASSERT(fBlitter);
127f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return fBlitter;
128f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
129f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
130f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerprivate:
131f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    const SkAAClip* fAAClip;
132f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkRegion        fBWRgn;
133f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkAAClipBlitter fAABlitter;
134f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    // what we return
135f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    const SkRegion* fClipRgn;
136f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkBlitter* fBlitter;
137f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger};
138f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
139f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif
140