Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(76)

Side by Side Diff: src/gpu/GrShape.h

Issue 1922713002: Add support for building GrShape from SkPath and more tests (Closed) Base URL: https://chromium.googlesource.com/skia.git@strokeinfo
Patch Set: Address comments Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/gpu/GrShape.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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)
37 : fType(Type::kPath)
38 , fPath(&path) {
39 this->attemptToReduceFromPath();
40 }
41
36 GrShape() : fType(Type::kEmpty) {} 42 GrShape() : fType(Type::kEmpty) {}
37 43
38 explicit GrShape(const SkRRect& rrect) : fType(Type::kRRect), fRRect(rrect) {} 44 explicit GrShape(const SkRRect& rrect) : fType(Type::kRRect), fRRect(rrect) {}
39 explicit GrShape(const SkRect& rect) : fType(Type::kRRect), fRRect(SkRRect:: MakeRect(rect)) {} 45 explicit GrShape(const SkRect& rect) : fType(Type::kRRect), fRRect(SkRRect:: MakeRect(rect)) {}
40 46
47 GrShape(const SkPath& path, const GrStyle& style)
48 : fType(Type::kPath)
49 , fPath(&path)
50 , fStyle(style) {
51 this->attemptToReduceFromPath();
52 }
53
41 GrShape(const SkRRect& rrect, const GrStyle& style) 54 GrShape(const SkRRect& rrect, const GrStyle& style)
42 : fType(Type::kRRect) 55 : fType(Type::kRRect)
43 , fRRect(rrect) 56 , fRRect(rrect)
44 , fStyle(style) {} 57 , fStyle(style) {}
45 58
46 GrShape(const SkRect& rect, const GrStyle& style) 59 GrShape(const SkRect& rect, const GrStyle& style)
47 : fType(Type::kRRect) 60 : fType(Type::kRRect)
48 , fRRect(SkRRect::MakeRect(rect)) 61 , fRRect(SkRRect::MakeRect(rect))
49 , fStyle(style) {} 62 , fStyle(style) {}
50 63
64 GrShape(const SkPath& path, const SkPaint& paint)
65 : fType(Type::kPath)
66 , fPath(&path)
67 , fStyle(paint) {
68 this->attemptToReduceFromPath();
69 }
70
51 GrShape(const SkRRect& rrect, const SkPaint& paint) 71 GrShape(const SkRRect& rrect, const SkPaint& paint)
52 : fType(Type::kRRect) 72 : fType(Type::kRRect)
53 , fRRect(rrect) 73 , fRRect(rrect)
54 , fStyle(paint) {} 74 , fStyle(paint) {}
55 75
56 GrShape(const SkRect& rect, const SkPaint& paint) 76 GrShape(const SkRect& rect, const SkPaint& paint)
57 : fType(Type::kRRect) 77 : fType(Type::kRRect)
58 , fRRect(SkRRect::MakeRect(rect)) 78 , fRRect(SkRRect::MakeRect(rect))
59 , fStyle(paint) {} 79 , fStyle(paint) {}
60 80
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 int unstyledKeySize() const; 135 int unstyledKeySize() const;
116 136
117 /** 137 /**
118 * Writes unstyledKeySize() bytes into the provided pointer. Assumes that th ere is enough 138 * Writes unstyledKeySize() bytes into the provided pointer. Assumes that th ere is enough
119 * space allocated for the key and that unstyledKeySize() does not return a negative value 139 * space allocated for the key and that unstyledKeySize() does not return a negative value
120 * for this shape. 140 * for this shape.
121 */ 141 */
122 void writeUnstyledKey(uint32_t* key) const; 142 void writeUnstyledKey(uint32_t* key) const;
123 143
124 private: 144 private:
145 enum class Type {
146 kEmpty,
147 kRRect,
148 kPath,
149 };
150
125 /** 151 /**
126 * Computes the key length for a GrStyle. The return will be negative if it cannot be turned 152 * Computes the key length for a GrStyle. The return will be negative if it cannot be turned
127 * into a key. 153 * into a key.
128 */ 154 */
129 static int StyleKeySize(const GrStyle& , bool stopAfterPE); 155 static int StyleKeySize(const GrStyle& , bool stopAfterPE);
130 156
131 /** 157 /**
132 * Writes a unique key for the style into the provided buffer. This function assumes the buffer 158 * Writes a unique key for the style into the provided buffer. This function assumes the buffer
133 * has room for at least StyleKeySize() values. It assumes that StyleKeySize () returns a 159 * has room for at least StyleKeySize() values. It assumes that StyleKeySize () returns a
134 * positive value for the style and stopAfterPE param. This is written so th at the key for just 160 * positive value for the style and stopAfterPE param. This is written so th at the key for just
135 * dash application followed by the key for the remaining SkStrokeRec is the same as the 161 * dash application followed by the key for the remaining SkStrokeRec is the same as the
136 * key for applying dashing and SkStrokeRec all at once. 162 * key for applying dashing and SkStrokeRec all at once.
137 */ 163 */
138 static void StyleKey(uint32_t*, const GrStyle&, bool stopAfterPE); 164 static void StyleKey(uint32_t*, const GrStyle&, bool stopAfterPE);
139 165
140 /** Constructor used by Apply* functions */ 166 /** Constructor used by Apply* functions */
141 GrShape(const GrShape& parentShape, bool stopAfterPE); 167 GrShape(const GrShape& parentShape, bool stopAfterPE);
142 168
143 /** 169 /**
144 * Determines the key we should inherit from the input shape's geometry and style when 170 * Determines the key we should inherit from the input shape's geometry and style when
145 * we are applying the style to create a new shape. 171 * we are applying the style to create a new shape.
146 */ 172 */
147 void setInheritedKey(const GrShape& parentShape, bool stopAfterPE); 173 void setInheritedKey(const GrShape& parentShape, bool stopAfterPE);
148 174
149 enum class Type { 175 void attemptToReduceFromPath() {
150 kEmpty, 176 SkASSERT(Type::kPath == fType);
151 kRRect, 177 fType = AttemptToReduceFromPathImpl(*fPath.get(), &fRRect, fStyle.pathEf fect(),
152 kPath, 178 fStyle.strokeRec());
153 } fType; 179 if (Type::kPath != fType) {
180 fPath.reset();
181 fInheritedKey.reset(0);
182 }
183 }
154 184
185 static Type AttemptToReduceFromPathImpl(const SkPath& path, SkRRect* rrect,
186 const SkPathEffect* pe, const SkStro keRec& strokeRec) {
187 if (path.isEmpty()) {
188 return Type::kEmpty;
189 }
190 if (path.isRRect(rrect)) {
191 return Type::kRRect;
192 }
193 SkRect rect;
194 if (path.isOval(&rect)) {
195 rrect->setOval(rect);
196 return Type::kRRect;
197 }
198 bool closed;
199 if (path.isRect(&rect, &closed, nullptr)) {
200 if (closed || (!pe && strokeRec.isFillStyle())) {
201 rrect->setRect(rect);
202 return Type::kRRect;
203 }
204 }
205 return Type::kPath;
206 }
207
208 Type fType;
155 SkRRect fRRect; 209 SkRRect fRRect;
156 SkTLazy<SkPath> fPath; 210 SkTLazy<SkPath> fPath;
157 GrStyle fStyle; 211 GrStyle fStyle;
158 SkAutoSTArray<8, uint32_t> fInheritedKey; 212 SkAutoSTArray<8, uint32_t> fInheritedKey;
159 }; 213 };
160 #endif 214 #endif
OLDNEW
« no previous file with comments | « no previous file | src/gpu/GrShape.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698