Chromium Code Reviews| 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 18 matching lines...) Expand all Loading... | |
| 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() : fType(Type::kEmpty) {} | 36 GrShape() : fType(Type::kEmpty) {} |
| 37 | 37 |
| 38 explicit GrShape(const SkRRect& rrect) : fType(Type::kRRect), fRRect(rrect) {} | 38 explicit GrShape(const SkRRect& rrect) : fType(Type::kRRect), fRRect(rrect) {} |
| 39 explicit GrShape(const SkRect& rect) : fType(Type::kRRect), fRRect(SkRRect:: MakeRect(rect)) {} | 39 explicit GrShape(const SkRect& rect) : fType(Type::kRRect), fRRect(SkRRect:: MakeRect(rect)) {} |
|
robertphillips
2016/04/26 22:18:32
No un-styled variants ?
bsalomon
2016/04/29 23:12:06
Done.
| |
| 40 | 40 |
| 41 GrShape(const SkPath& path, const GrStyle& style) | |
| 42 : fType(Type::kPath) | |
| 43 , fPath(&path) | |
| 44 , fStyle(style) { | |
| 45 this->attemptToReduceFromPath(); | |
| 46 } | |
| 47 | |
| 41 GrShape(const SkRRect& rrect, const GrStyle& style) | 48 GrShape(const SkRRect& rrect, const GrStyle& style) |
| 42 : fType(Type::kRRect) | 49 : fType(Type::kRRect) |
| 43 , fRRect(rrect) | 50 , fRRect(rrect) |
| 44 , fStyle(style) {} | 51 , fStyle(style) {} |
| 45 | 52 |
| 46 GrShape(const SkRect& rect, const GrStyle& style) | 53 GrShape(const SkRect& rect, const GrStyle& style) |
| 47 : fType(Type::kRRect) | 54 : fType(Type::kRRect) |
| 48 , fRRect(SkRRect::MakeRect(rect)) | 55 , fRRect(SkRRect::MakeRect(rect)) |
| 49 , fStyle(style) {} | 56 , fStyle(style) {} |
| 50 | 57 |
| 58 GrShape(const SkPath& path, const SkPaint& paint) | |
| 59 : fType(Type::kPath) | |
| 60 , fPath(&path) | |
| 61 , fStyle(paint) { | |
| 62 this->attemptToReduceFromPath(); | |
| 63 } | |
| 64 | |
| 51 GrShape(const SkRRect& rrect, const SkPaint& paint) | 65 GrShape(const SkRRect& rrect, const SkPaint& paint) |
| 52 : fType(Type::kRRect) | 66 : fType(Type::kRRect) |
| 53 , fRRect(rrect) | 67 , fRRect(rrect) |
| 54 , fStyle(paint) {} | 68 , fStyle(paint) {} |
| 55 | 69 |
| 56 GrShape(const SkRect& rect, const SkPaint& paint) | 70 GrShape(const SkRect& rect, const SkPaint& paint) |
| 57 : fType(Type::kRRect) | 71 : fType(Type::kRRect) |
| 58 , fRRect(SkRRect::MakeRect(rect)) | 72 , fRRect(SkRRect::MakeRect(rect)) |
| 59 , fStyle(paint) {} | 73 , fStyle(paint) {} |
| 60 | 74 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 115 int unstyledKeySize() const; | 129 int unstyledKeySize() const; |
| 116 | 130 |
| 117 /** | 131 /** |
| 118 * Writes unstyledKeySize() bytes into the provided pointer. Assumes that th ere is enough | 132 * 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 | 133 * space allocated for the key and that unstyledKeySize() does not return a negative value |
| 120 * for this shape. | 134 * for this shape. |
| 121 */ | 135 */ |
| 122 void writeUnstyledKey(uint32_t* key) const; | 136 void writeUnstyledKey(uint32_t* key) const; |
| 123 | 137 |
| 124 private: | 138 private: |
| 139 enum class Type { | |
| 140 kEmpty, | |
| 141 kRRect, | |
| 142 kPath, | |
| 143 }; | |
| 144 | |
| 125 /** | 145 /** |
| 126 * Computes the key length for a GrStyle. The return will be negative if it cannot be turned | 146 * Computes the key length for a GrStyle. The return will be negative if it cannot be turned |
| 127 * into a key. | 147 * into a key. |
| 128 */ | 148 */ |
| 129 static int StyleKeySize(const GrStyle& , bool stopAfterPE); | 149 static int StyleKeySize(const GrStyle& , bool stopAfterPE); |
| 130 | 150 |
| 131 /** | 151 /** |
| 132 * Writes a unique key for the style into the provided buffer. This function assumes the buffer | 152 * 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 | 153 * 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 | 154 * 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 | 155 * 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. | 156 * key for applying dashing and SkStrokeRec all at once. |
| 137 */ | 157 */ |
| 138 static void StyleKey(uint32_t*, const GrStyle&, bool stopAfterPE); | 158 static void StyleKey(uint32_t*, const GrStyle&, bool stopAfterPE); |
| 139 | 159 |
| 140 /** Constructor used by Apply* functions */ | 160 /** Constructor used by Apply* functions */ |
| 141 GrShape(const GrShape& parentShape, bool stopAfterPE); | 161 GrShape(const GrShape& parentShape, bool stopAfterPE); |
| 142 | 162 |
| 143 /** | 163 /** |
| 144 * Determines the key we should inherit from the input shape's geometry and style when | 164 * 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. | 165 * we are applying the style to create a new shape. |
| 146 */ | 166 */ |
| 147 void setInheritedKey(const GrShape& parentShape, bool stopAfterPE); | 167 void setInheritedKey(const GrShape& parentShape, bool stopAfterPE); |
| 148 | 168 |
| 149 enum class Type { | 169 void attemptToReduceFromPath() { |
| 150 kEmpty, | 170 SkASSERT(Type::kPath == fType); |
| 151 kRRect, | 171 fType = AttemptToReduceFromPathImpl(*fPath.get(), &fRRect, fStyle.pathEf fect(), |
| 152 kPath, | 172 fStyle.strokeRec()); |
| 153 } fType; | 173 if (Type::kPath != fType) { |
| 174 fPath.reset(); | |
| 175 fInheritedKey.reset(0); | |
| 176 } | |
| 177 } | |
| 154 | 178 |
| 179 static Type AttemptToReduceFromPathImpl(const SkPath& path, SkRRect* rrect, | |
| 180 const SkPathEffect* pe, const SkStro keRec& strokeRec) { | |
| 181 if (path.isEmpty()) { | |
| 182 return Type::kEmpty; | |
| 183 } | |
| 184 if (path.isRRect(rrect)) { | |
| 185 return Type::kRRect; | |
| 186 } | |
| 187 SkRect rect; | |
| 188 if (path.isOval(&rect)) { | |
| 189 rrect->setOval(rect); | |
| 190 return Type::kRRect; | |
| 191 } | |
| 192 bool closed; | |
| 193 if (path.isRect(&rect, &closed, nullptr)) { | |
| 194 if (closed || (!pe && strokeRec.isFillStyle())) { | |
| 195 rrect->setRect(rect); | |
| 196 return Type::kRRect; | |
| 197 } | |
| 198 } | |
| 199 return Type::kPath; | |
| 200 } | |
| 201 | |
| 202 Type fType; | |
| 155 SkRRect fRRect; | 203 SkRRect fRRect; |
| 156 SkTLazy<SkPath> fPath; | 204 SkTLazy<SkPath> fPath; |
| 157 GrStyle fStyle; | 205 GrStyle fStyle; |
| 158 SkAutoSTArray<8, uint32_t> fInheritedKey; | 206 SkAutoSTArray<8, uint32_t> fInheritedKey; |
| 159 }; | 207 }; |
| 160 #endif | 208 #endif |
| OLD | NEW |