epoger@google.com | ec3ed6a | 2011-07-28 14:26:00 +0000 | [diff] [blame] | 1 | |
reed@google.com | ac10a2d | 2010-12-22 21:39:39 +0000 | [diff] [blame] | 2 | /* |
epoger@google.com | ec3ed6a | 2011-07-28 14:26:00 +0000 | [diff] [blame] | 3 | * Copyright 2010 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. |
reed@google.com | ac10a2d | 2010-12-22 21:39:39 +0000 | [diff] [blame] | 7 | */ |
| 8 | |
| 9 | |
epoger@google.com | ec3ed6a | 2011-07-28 14:26:00 +0000 | [diff] [blame] | 10 | |
reed@google.com | ac10a2d | 2010-12-22 21:39:39 +0000 | [diff] [blame] | 11 | #ifndef GrClip_DEFINED |
| 12 | #define GrClip_DEFINED |
| 13 | |
| 14 | #include "GrClipIterator.h" |
| 15 | #include "GrRect.h" |
bsalomon@google.com | d302f14 | 2011-03-03 13:54:13 +0000 | [diff] [blame] | 16 | #include "GrPath.h" |
bsalomon@google.com | a55847b | 2011-04-20 15:47:04 +0000 | [diff] [blame] | 17 | #include "GrTemplates.h" |
bsalomon@google.com | d302f14 | 2011-03-03 13:54:13 +0000 | [diff] [blame] | 18 | |
bsalomon@google.com | 49313f6 | 2011-09-14 13:54:05 +0000 | [diff] [blame] | 19 | #include "SkTArray.h" |
reed@google.com | ac10a2d | 2010-12-22 21:39:39 +0000 | [diff] [blame] | 20 | |
| 21 | class GrClip { |
| 22 | public: |
| 23 | GrClip(); |
| 24 | GrClip(const GrClip& src); |
reed@google.com | 6f8f292 | 2011-03-04 22:27:10 +0000 | [diff] [blame] | 25 | /** |
bsalomon@google.com | 0b50b2e | 2011-03-08 21:07:21 +0000 | [diff] [blame] | 26 | * If specified, the conservativeBounds parameter already takes (tx,ty) |
| 27 | * into account. |
reed@google.com | 6f8f292 | 2011-03-04 22:27:10 +0000 | [diff] [blame] | 28 | */ |
| 29 | GrClip(GrClipIterator* iter, GrScalar tx, GrScalar ty, |
bsalomon@google.com | 0b50b2e | 2011-03-08 21:07:21 +0000 | [diff] [blame] | 30 | const GrRect* conservativeBounds = NULL); |
bsalomon@google.com | d302f14 | 2011-03-03 13:54:13 +0000 | [diff] [blame] | 31 | GrClip(const GrIRect& rect); |
| 32 | GrClip(const GrRect& rect); |
| 33 | |
reed@google.com | ac10a2d | 2010-12-22 21:39:39 +0000 | [diff] [blame] | 34 | ~GrClip(); |
| 35 | |
| 36 | GrClip& operator=(const GrClip& src); |
| 37 | |
bsalomon@google.com | 0b50b2e | 2011-03-08 21:07:21 +0000 | [diff] [blame] | 38 | bool hasConservativeBounds() const { return fConservativeBoundsValid; } |
bsalomon@google.com | d302f14 | 2011-03-03 13:54:13 +0000 | [diff] [blame] | 39 | |
bsalomon@google.com | 0b50b2e | 2011-03-08 21:07:21 +0000 | [diff] [blame] | 40 | const GrRect& getConservativeBounds() const { return fConservativeBounds; } |
bsalomon@google.com | d302f14 | 2011-03-03 13:54:13 +0000 | [diff] [blame] | 41 | |
| 42 | int getElementCount() const { return fList.count(); } |
| 43 | |
| 44 | GrClipType getElementType(int i) const { return fList[i].fType; } |
| 45 | |
| 46 | const GrPath& getPath(int i) const { |
| 47 | GrAssert(kPath_ClipType == fList[i].fType); |
| 48 | return fList[i].fPath; |
reed@google.com | ac10a2d | 2010-12-22 21:39:39 +0000 | [diff] [blame] | 49 | } |
bsalomon@google.com | d302f14 | 2011-03-03 13:54:13 +0000 | [diff] [blame] | 50 | |
| 51 | GrPathFill getPathFill(int i) const { |
| 52 | GrAssert(kPath_ClipType == fList[i].fType); |
| 53 | return fList[i].fPathFill; |
| 54 | } |
| 55 | |
| 56 | const GrRect& getRect(int i) const { |
| 57 | GrAssert(kRect_ClipType == fList[i].fType); |
| 58 | return fList[i].fRect; |
| 59 | } |
| 60 | |
djsollen@google.com | cd9d69b | 2011-03-14 20:30:14 +0000 | [diff] [blame] | 61 | GrSetOp getOp(int i) const { return fList[i].fOp; } |
bsalomon@google.com | d302f14 | 2011-03-03 13:54:13 +0000 | [diff] [blame] | 62 | |
| 63 | bool isRect() const { |
bsalomon@google.com | ab3dee5 | 2011-08-29 15:18:41 +0000 | [diff] [blame] | 64 | if (1 == fList.count() && kRect_ClipType == fList[0].fType && |
| 65 | (kIntersect_SetOp == fList[0].fOp || |
| 66 | kReplace_SetOp == fList[0].fOp)) { |
bsalomon@google.com | 0b50b2e | 2011-03-08 21:07:21 +0000 | [diff] [blame] | 67 | // if we determined that the clip is a single rect |
| 68 | // we ought to have also used that rect as the bounds. |
| 69 | GrAssert(fConservativeBoundsValid); |
| 70 | GrAssert(fConservativeBounds == fList[0].fRect); |
bsalomon@google.com | d302f14 | 2011-03-03 13:54:13 +0000 | [diff] [blame] | 71 | return true; |
| 72 | } else { |
| 73 | return false; |
| 74 | } |
| 75 | } |
| 76 | |
| 77 | bool isEmpty() const { return 0 == fList.count(); } |
reed@google.com | ac10a2d | 2010-12-22 21:39:39 +0000 | [diff] [blame] | 78 | |
| 79 | /** |
bsalomon@google.com | d302f14 | 2011-03-03 13:54:13 +0000 | [diff] [blame] | 80 | * Resets this clip to be empty |
reed@google.com | ac10a2d | 2010-12-22 21:39:39 +0000 | [diff] [blame] | 81 | */ |
| 82 | void setEmpty(); |
reed@google.com | 6f8f292 | 2011-03-04 22:27:10 +0000 | [diff] [blame] | 83 | |
| 84 | /** |
| 85 | * If specified, the bounds parameter already takes (tx,ty) into account. |
| 86 | */ |
| 87 | void setFromIterator(GrClipIterator* iter, GrScalar tx, GrScalar ty, |
bsalomon@google.com | 0b50b2e | 2011-03-08 21:07:21 +0000 | [diff] [blame] | 88 | const GrRect* conservativeBounds = NULL); |
bsalomon@google.com | d302f14 | 2011-03-03 13:54:13 +0000 | [diff] [blame] | 89 | void setFromRect(const GrRect& rect); |
| 90 | void setFromIRect(const GrIRect& rect); |
reed@google.com | ac10a2d | 2010-12-22 21:39:39 +0000 | [diff] [blame] | 91 | |
| 92 | friend bool operator==(const GrClip& a, const GrClip& b) { |
bsalomon@google.com | d302f14 | 2011-03-03 13:54:13 +0000 | [diff] [blame] | 93 | if (a.fList.count() != b.fList.count()) { |
| 94 | return false; |
| 95 | } |
| 96 | int count = a.fList.count(); |
| 97 | for (int i = 0; i < count; ++i) { |
| 98 | if (a.fList[i] != b.fList[i]) { |
| 99 | return false; |
| 100 | } |
| 101 | } |
| 102 | return true; |
reed@google.com | ac10a2d | 2010-12-22 21:39:39 +0000 | [diff] [blame] | 103 | } |
| 104 | friend bool operator!=(const GrClip& a, const GrClip& b) { |
| 105 | return !(a == b); |
| 106 | } |
| 107 | |
reed@google.com | ac10a2d | 2010-12-22 21:39:39 +0000 | [diff] [blame] | 108 | private: |
bsalomon@google.com | d302f14 | 2011-03-03 13:54:13 +0000 | [diff] [blame] | 109 | struct Element { |
| 110 | GrClipType fType; |
| 111 | GrRect fRect; |
| 112 | GrPath fPath; |
| 113 | GrPathFill fPathFill; |
| 114 | GrSetOp fOp; |
| 115 | bool operator ==(const Element& e) const { |
| 116 | if (e.fType != fType || e.fOp != fOp) { |
| 117 | return false; |
| 118 | } |
| 119 | switch (fType) { |
| 120 | case kRect_ClipType: |
| 121 | return fRect == e.fRect; |
bsalomon@google.com | d302f14 | 2011-03-03 13:54:13 +0000 | [diff] [blame] | 122 | case kPath_ClipType: |
| 123 | return fPath == e.fPath; |
| 124 | default: |
| 125 | GrCrash("Unknown clip element type."); |
| 126 | return false; // suppress warning |
| 127 | } |
| 128 | } |
| 129 | bool operator !=(const Element& e) const { return !(*this == e); } |
| 130 | }; |
reed@google.com | ac10a2d | 2010-12-22 21:39:39 +0000 | [diff] [blame] | 131 | |
bsalomon@google.com | 0b50b2e | 2011-03-08 21:07:21 +0000 | [diff] [blame] | 132 | GrRect fConservativeBounds; |
| 133 | bool fConservativeBoundsValid; |
reed@google.com | ac10a2d | 2010-12-22 21:39:39 +0000 | [diff] [blame] | 134 | |
bsalomon@google.com | d302f14 | 2011-03-03 13:54:13 +0000 | [diff] [blame] | 135 | enum { |
| 136 | kPreAllocElements = 4, |
| 137 | }; |
bsalomon@google.com | 49313f6 | 2011-09-14 13:54:05 +0000 | [diff] [blame] | 138 | SkAlignedSTStorage<kPreAllocElements, Element> fListStorage; |
| 139 | SkTArray<Element> fList; |
bsalomon@google.com | d302f14 | 2011-03-03 13:54:13 +0000 | [diff] [blame] | 140 | }; |
reed@google.com | ac10a2d | 2010-12-22 21:39:39 +0000 | [diff] [blame] | 141 | #endif |
| 142 | |