OLD | NEW |
---|---|
(Empty) | |
1 /* | |
2 * Copyright 2016 Google Inc. | |
3 * | |
4 * Use of this source code is governed by a BSD-style license that can be | |
5 * found in the LICENSE file. | |
6 */ | |
7 | |
8 #ifndef GrShape_DEFINED | |
9 #define GrShape_DEFINED | |
10 | |
11 #include "GrStyle.h" | |
12 #include "SkPath.h" | |
13 #include "SkRRect.h" | |
14 #include "SkTemplates.h" | |
15 | |
16 /** | |
17 * Represents a geometric shape (rrect or path) and the GrStyle that it should b e rendered with. | |
18 * It is possible to apply the style to the GrShape to produce a new GrShape whe re the geometry | |
19 * reflects the styling information (e.g. is stroked). It is also possible to ap ply just the | |
20 * path effect from the style. In this case the resulting shape will include any remaining | |
21 * stroking information that is to be applied after the path effect. | |
22 * | |
23 * Shapes can produce keys that represent only the geometry information, not the style. Note that | |
24 * when styling information is applied to produce a new shape then the style has been converted | |
robertphillips
2016/04/24 23:00:44
shapes -> shape's
bsalomon
2016/04/25 13:32:26
Done.
| |
25 * to geometric information and is included in the new shapes key. When the same style is applied | |
26 * to two shapes that reflect the same underlying geometry the computed keys of the stylized shapes | |
27 * will be the same. | |
28 * | |
29 * Currently this can only be constructed from a rrect, though it can become a p ath by applying | |
30 * style to the geometry. The idea is to expand this to cover most or all of the geometries that | |
31 * have SkCanvas::draw APIs. | |
32 */ | |
33 class GrShape { | |
34 public: | |
35 GrShape() : fType(Type::kEmpty) {} | |
36 | |
37 explicit GrShape(const SkRRect& rrect) : fType(Type::kRRect), fRRect(rrect) {} | |
38 explicit GrShape(const SkRect& rect) : fType(Type::kRRect), fRRect(SkRRect:: MakeRect(rect)) {} | |
39 | |
40 GrShape(const SkRRect& rrect, const GrStyle& style) | |
41 : fType(Type::kRRect) | |
42 , fRRect(rrect) | |
43 , fStyle(style) {} | |
44 | |
45 GrShape(const SkRect& rect, const GrStyle& style) | |
46 : fType(Type::kRRect) | |
47 , fRRect(SkRRect::MakeRect(rect)) | |
48 , fStyle(style) {} | |
49 | |
50 GrShape(const SkRRect& rrect, const SkPaint& paint) | |
51 : fType(Type::kRRect) | |
52 , fRRect(rrect) | |
53 , fStyle(paint) {} | |
54 | |
55 GrShape(const SkRect& rect, const SkPaint& paint) | |
56 : fType(Type::kRRect) | |
57 , fRRect(SkRRect::MakeRect(rect)) | |
58 , fStyle(paint) {} | |
59 | |
60 GrShape(const GrShape&); | |
61 GrShape& operator=(const GrShape& that); | |
62 | |
63 ~GrShape() { | |
64 if (Type::kPath == fType) { | |
65 fPath.~SkPath(); | |
66 } | |
67 } | |
68 | |
69 const GrStyle& style() const { return fStyle; } | |
70 | |
71 /** | |
robertphillips
2016/04/24 23:00:44
fully ?
bsalomon
2016/04/25 13:32:26
Done.
| |
72 * Returns a GrShape where the shape's geometry full reflects the original s hape's GrStyle. | |
robertphillips
2016/04/24 23:00:44
shap -> shape ?
bsalomon
2016/04/25 13:32:26
Done.
| |
73 * The GrStyle of the returned shap will either be fill or hairline. | |
74 */ | |
75 GrShape applyFullStyle() { return GrShape(*this, false); } | |
76 | |
77 /** | |
78 * Similar to above but applies only the path effect. Path effects take the original geometry | |
79 * and fill/stroking information and compute a new geometry and residual fil l/stroking | |
80 * information to be applied. The path effect's output geometry and stroking will be captured | |
81 * in the returned GrShape. | |
82 */ | |
83 GrShape applyPathEffect() { return GrShape(*this, true); } | |
84 | |
85 bool asRRect(SkRRect* rrect) const { | |
86 if (Type::kRRect != fType) { | |
87 return false; | |
88 } | |
89 if (rrect) { | |
90 *rrect = fRRect; | |
91 } | |
92 return true; | |
93 } | |
94 | |
95 void asPath(SkPath* out) const { | |
96 switch (fType) { | |
97 case Type::kRRect: | |
98 out->reset(); | |
99 out->addRRect(fRRect); | |
100 break; | |
101 case Type::kPath: | |
102 *out = fPath; | |
103 break; | |
104 case Type::kEmpty: | |
105 out->reset(); | |
106 break; | |
107 } | |
108 } | |
109 | |
110 /** | |
111 * Gets the size of the key for the shape represented by this GrShape (ignor ing its styling). | |
112 * A negative value is returned if the shape has no key (shouldn't be cached ). | |
113 */ | |
114 int unstyledKeySize() const; | |
115 | |
116 /** | |
117 * Writes unstyledKeySize() bytes into the provided pointer. Assumes that th ere is enough | |
118 * space allocated for the key and that unstyledKeySize() does not return a negative value | |
119 * for this shape. | |
120 */ | |
121 void writeUnstyledKey(uint32_t* key) const; | |
122 | |
123 private: | |
124 /** | |
125 * Computes the key length for a GrStyle. The return will be negative if it cannot be turned | |
126 * into a key. | |
127 */ | |
128 static int StyleKeySize(const GrStyle& , bool stopAfterPE); | |
129 | |
130 /** | |
131 * Writes a unique key for the style into the provided buffer. This function assumes the buffer | |
132 * has room for at least StyleKeySize() values. It assumes that StyleKeySize () returns a | |
133 * positive value for the style and stopAfterPE param. This is written so th at the key for just | |
134 * dash application followed by the key for the remaining SkStrokeRec is the same as the | |
135 * key for applying dashing and SkStrokeRec all at once. | |
136 */ | |
137 static void StyleKey(uint32_t*, const GrStyle&, bool stopAfterPE); | |
138 | |
139 /** Constructor used by Apply* functions */ | |
140 GrShape(const GrShape& parentShape, bool stopAfterPE); | |
141 | |
142 /** | |
143 * Determines the key we should inherit from the input shape's geometry and style when | |
144 * we are applying the style to create a new shape. | |
145 */ | |
146 void setInheritedKey(const GrShape& parentShape, bool stopAfterPE); | |
147 | |
148 enum class Type { | |
149 kEmpty, | |
150 kRRect, | |
151 kPath, | |
152 } fType; | |
153 | |
154 union { | |
155 SkRRect fRRect; | |
156 SkPath fPath; | |
157 }; | |
158 GrStyle fStyle; | |
159 SkAutoSTArray<8, uint32_t> fInheritedKey; | |
160 }; | |
161 #endif | |
OLD | NEW |