OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #ifndef GrShape_DEFINED | 8 #ifndef GrShape_DEFINED |
9 #define GrShape_DEFINED | 9 #define GrShape_DEFINED |
10 | 10 |
(...skipping 15 matching lines...) Expand all Loading... |
26 * to geometric information and is included in the new shape's key. When the sam
e style is applied | 26 * to geometric information and is included in the new shape's key. When the sam
e style is applied |
27 * to two shapes that reflect the same underlying geometry the computed keys of
the stylized shapes | 27 * to two shapes that reflect the same underlying geometry the computed keys of
the stylized shapes |
28 * will be the same. | 28 * will be the same. |
29 * | 29 * |
30 * Currently this can only be constructed from a rrect, though it can become a p
ath by applying | 30 * Currently this can only be constructed from a rrect, though it can become a p
ath by applying |
31 * style to the geometry. The idea is to expand this to cover most or all of the
geometries that | 31 * style to the geometry. The idea is to expand this to cover most or all of the
geometries that |
32 * have SkCanvas::draw APIs. | 32 * have SkCanvas::draw APIs. |
33 */ | 33 */ |
34 class GrShape { | 34 class GrShape { |
35 public: | 35 public: |
36 GrShape(const SkPath& path) | 36 GrShape() : fType(Type::kEmpty) {} |
| 37 |
| 38 explicit GrShape(const SkPath& path) |
37 : fType(Type::kPath) | 39 : fType(Type::kPath) |
38 , fPath(&path) { | 40 , fPath(&path) { |
39 this->attemptToReduceFromPath(); | 41 this->attemptToReduceFromPath(); |
40 } | 42 } |
41 | 43 |
42 GrShape() : fType(Type::kEmpty) {} | 44 explicit GrShape(const SkRRect& rrect) |
| 45 : fType(Type::kRRect) |
| 46 , fRRect(rrect) { |
| 47 this->attemptToReduceFromRRect(); |
| 48 } |
43 | 49 |
44 explicit GrShape(const SkRRect& rrect) : fType(Type::kRRect), fRRect(rrect)
{} | 50 explicit GrShape(const SkRect& rect) |
45 explicit GrShape(const SkRect& rect) : fType(Type::kRRect), fRRect(SkRRect::
MakeRect(rect)) {} | 51 : fType(Type::kRRect) |
| 52 , fRRect(SkRRect::MakeRect(rect)) { |
| 53 this->attemptToReduceFromRRect(); |
| 54 } |
46 | 55 |
47 GrShape(const SkPath& path, const GrStyle& style) | 56 GrShape(const SkPath& path, const GrStyle& style) |
48 : fType(Type::kPath) | 57 : fType(Type::kPath) |
49 , fPath(&path) | 58 , fPath(&path) |
50 , fStyle(style) { | 59 , fStyle(style) { |
51 this->attemptToReduceFromPath(); | 60 this->attemptToReduceFromPath(); |
52 } | 61 } |
53 | 62 |
54 GrShape(const SkRRect& rrect, const GrStyle& style) | 63 GrShape(const SkRRect& rrect, const GrStyle& style) |
55 : fType(Type::kRRect) | 64 : fType(Type::kRRect) |
56 , fRRect(rrect) | 65 , fRRect(rrect) |
57 , fStyle(style) {} | 66 , fStyle(style) { |
| 67 this->attemptToReduceFromRRect(); |
| 68 } |
58 | 69 |
59 GrShape(const SkRect& rect, const GrStyle& style) | 70 GrShape(const SkRect& rect, const GrStyle& style) |
60 : fType(Type::kRRect) | 71 : fType(Type::kRRect) |
61 , fRRect(SkRRect::MakeRect(rect)) | 72 , fRRect(SkRRect::MakeRect(rect)) |
62 , fStyle(style) {} | 73 , fStyle(style) { |
| 74 this->attemptToReduceFromRRect(); |
| 75 } |
63 | 76 |
64 GrShape(const SkPath& path, const SkPaint& paint) | 77 GrShape(const SkPath& path, const SkPaint& paint) |
65 : fType(Type::kPath) | 78 : fType(Type::kPath) |
66 , fPath(&path) | 79 , fPath(&path) |
67 , fStyle(paint) { | 80 , fStyle(paint) { |
68 this->attemptToReduceFromPath(); | 81 this->attemptToReduceFromPath(); |
69 } | 82 } |
70 | 83 |
71 GrShape(const SkRRect& rrect, const SkPaint& paint) | 84 GrShape(const SkRRect& rrect, const SkPaint& paint) |
72 : fType(Type::kRRect) | 85 : fType(Type::kRRect) |
73 , fRRect(rrect) | 86 , fRRect(rrect) |
74 , fStyle(paint) {} | 87 , fStyle(paint) { |
| 88 this->attemptToReduceFromRRect(); |
| 89 } |
75 | 90 |
76 GrShape(const SkRect& rect, const SkPaint& paint) | 91 GrShape(const SkRect& rect, const SkPaint& paint) |
77 : fType(Type::kRRect) | 92 : fType(Type::kRRect) |
78 , fRRect(SkRRect::MakeRect(rect)) | 93 , fRRect(SkRRect::MakeRect(rect)) |
79 , fStyle(paint) {} | 94 , fStyle(paint) { |
| 95 this->attemptToReduceFromRRect(); |
| 96 } |
80 | 97 |
81 GrShape(const GrShape&); | 98 GrShape(const GrShape&); |
82 GrShape& operator=(const GrShape& that); | 99 GrShape& operator=(const GrShape& that); |
83 | 100 |
84 ~GrShape() { | 101 ~GrShape() { |
85 if (Type::kPath == fType) { | 102 if (Type::kPath == fType) { |
86 fPath.reset(); | 103 fPath.reset(); |
87 } | 104 } |
88 } | 105 } |
89 | 106 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
175 void attemptToReduceFromPath() { | 192 void attemptToReduceFromPath() { |
176 SkASSERT(Type::kPath == fType); | 193 SkASSERT(Type::kPath == fType); |
177 fType = AttemptToReduceFromPathImpl(*fPath.get(), &fRRect, fStyle.pathEf
fect(), | 194 fType = AttemptToReduceFromPathImpl(*fPath.get(), &fRRect, fStyle.pathEf
fect(), |
178 fStyle.strokeRec()); | 195 fStyle.strokeRec()); |
179 if (Type::kPath != fType) { | 196 if (Type::kPath != fType) { |
180 fPath.reset(); | 197 fPath.reset(); |
181 fInheritedKey.reset(0); | 198 fInheritedKey.reset(0); |
182 } | 199 } |
183 } | 200 } |
184 | 201 |
| 202 void attemptToReduceFromRRect() { |
| 203 SkASSERT(Type::kRRect == fType); |
| 204 SkASSERT(!fInheritedKey.count()); |
| 205 if (fRRect.isEmpty()) { |
| 206 fType = Type::kEmpty; |
| 207 } |
| 208 } |
| 209 |
185 static Type AttemptToReduceFromPathImpl(const SkPath& path, SkRRect* rrect, | 210 static Type AttemptToReduceFromPathImpl(const SkPath& path, SkRRect* rrect, |
186 const SkPathEffect* pe, const SkStro
keRec& strokeRec) { | 211 const SkPathEffect* pe, const SkStro
keRec& strokeRec) { |
187 if (path.isEmpty()) { | 212 if (path.isEmpty()) { |
188 return Type::kEmpty; | 213 return Type::kEmpty; |
189 } | 214 } |
190 if (path.isRRect(rrect)) { | 215 if (path.isRRect(rrect)) { |
| 216 SkASSERT(!rrect->isEmpty()); |
191 return Type::kRRect; | 217 return Type::kRRect; |
192 } | 218 } |
193 SkRect rect; | 219 SkRect rect; |
194 if (path.isOval(&rect)) { | 220 if (path.isOval(&rect)) { |
195 rrect->setOval(rect); | 221 rrect->setOval(rect); |
196 return Type::kRRect; | 222 return Type::kRRect; |
197 } | 223 } |
198 bool closed; | 224 bool closed; |
199 if (path.isRect(&rect, &closed, nullptr)) { | 225 if (path.isRect(&rect, &closed, nullptr)) { |
200 if (closed || (!pe && strokeRec.isFillStyle())) { | 226 if (closed || (!pe && strokeRec.isFillStyle())) { |
201 rrect->setRect(rect); | 227 rrect->setRect(rect); |
202 return Type::kRRect; | 228 return Type::kRRect; |
203 } | 229 } |
204 } | 230 } |
205 return Type::kPath; | 231 return Type::kPath; |
206 } | 232 } |
207 | 233 |
208 Type fType; | 234 Type fType; |
209 SkRRect fRRect; | 235 SkRRect fRRect; |
210 SkTLazy<SkPath> fPath; | 236 SkTLazy<SkPath> fPath; |
211 GrStyle fStyle; | 237 GrStyle fStyle; |
212 SkAutoSTArray<8, uint32_t> fInheritedKey; | 238 SkAutoSTArray<8, uint32_t> fInheritedKey; |
213 }; | 239 }; |
214 #endif | 240 #endif |
OLD | NEW |