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 #include "SkTLazy.h" |
| 16 |
| 17 /** |
| 18 * Represents a geometric shape (rrect or path) and the GrStyle that it should b
e rendered with. |
| 19 * It is possible to apply the style to the GrShape to produce a new GrShape whe
re the geometry |
| 20 * reflects the styling information (e.g. is stroked). It is also possible to ap
ply just the |
| 21 * path effect from the style. In this case the resulting shape will include any
remaining |
| 22 * stroking information that is to be applied after the path effect. |
| 23 * |
| 24 * Shapes can produce keys that represent only the geometry information, not the
style. Note that |
| 25 * when styling information is applied to produce a new shape then the style has
been converted |
| 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 |
| 28 * will be the same. |
| 29 * |
| 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 |
| 32 * have SkCanvas::draw APIs. |
| 33 */ |
| 34 class GrShape { |
| 35 public: |
| 36 GrShape() : fType(Type::kEmpty) {} |
| 37 |
| 38 explicit GrShape(const SkRRect& rrect) : fType(Type::kRRect), fRRect(rrect)
{} |
| 39 explicit GrShape(const SkRect& rect) : fType(Type::kRRect), fRRect(SkRRect::
MakeRect(rect)) {} |
| 40 |
| 41 GrShape(const SkRRect& rrect, const GrStyle& style) |
| 42 : fType(Type::kRRect) |
| 43 , fRRect(rrect) |
| 44 , fStyle(style) {} |
| 45 |
| 46 GrShape(const SkRect& rect, const GrStyle& style) |
| 47 : fType(Type::kRRect) |
| 48 , fRRect(SkRRect::MakeRect(rect)) |
| 49 , fStyle(style) {} |
| 50 |
| 51 GrShape(const SkRRect& rrect, const SkPaint& paint) |
| 52 : fType(Type::kRRect) |
| 53 , fRRect(rrect) |
| 54 , fStyle(paint) {} |
| 55 |
| 56 GrShape(const SkRect& rect, const SkPaint& paint) |
| 57 : fType(Type::kRRect) |
| 58 , fRRect(SkRRect::MakeRect(rect)) |
| 59 , fStyle(paint) {} |
| 60 |
| 61 GrShape(const GrShape&); |
| 62 GrShape& operator=(const GrShape& that); |
| 63 |
| 64 ~GrShape() { |
| 65 if (Type::kPath == fType) { |
| 66 fPath.reset(); |
| 67 } |
| 68 } |
| 69 |
| 70 const GrStyle& style() const { return fStyle; } |
| 71 |
| 72 /** |
| 73 * Returns a GrShape where the shape's geometry fully reflects the original
shape's GrStyle. |
| 74 * The GrStyle of the returned shape will either be fill or hairline. |
| 75 */ |
| 76 GrShape applyFullStyle() { return GrShape(*this, false); } |
| 77 |
| 78 /** |
| 79 * Similar to above but applies only the path effect. Path effects take the
original geometry |
| 80 * and fill/stroking information and compute a new geometry and residual fil
l/stroking |
| 81 * information to be applied. The path effect's output geometry and stroking
will be captured |
| 82 * in the returned GrShape. |
| 83 */ |
| 84 GrShape applyPathEffect() { return GrShape(*this, true); } |
| 85 |
| 86 bool asRRect(SkRRect* rrect) const { |
| 87 if (Type::kRRect != fType) { |
| 88 return false; |
| 89 } |
| 90 if (rrect) { |
| 91 *rrect = fRRect; |
| 92 } |
| 93 return true; |
| 94 } |
| 95 |
| 96 void asPath(SkPath* out) const { |
| 97 switch (fType) { |
| 98 case Type::kRRect: |
| 99 out->reset(); |
| 100 out->addRRect(fRRect); |
| 101 break; |
| 102 case Type::kPath: |
| 103 *out = *fPath.get(); |
| 104 break; |
| 105 case Type::kEmpty: |
| 106 out->reset(); |
| 107 break; |
| 108 } |
| 109 } |
| 110 |
| 111 /** |
| 112 * Gets the size of the key for the shape represented by this GrShape (ignor
ing its styling). |
| 113 * A negative value is returned if the shape has no key (shouldn't be cached
). |
| 114 */ |
| 115 int unstyledKeySize() const; |
| 116 |
| 117 /** |
| 118 * 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 |
| 120 * for this shape. |
| 121 */ |
| 122 void writeUnstyledKey(uint32_t* key) const; |
| 123 |
| 124 private: |
| 125 /** |
| 126 * Computes the key length for a GrStyle. The return will be negative if it
cannot be turned |
| 127 * into a key. |
| 128 */ |
| 129 static int StyleKeySize(const GrStyle& , bool stopAfterPE); |
| 130 |
| 131 /** |
| 132 * 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 |
| 134 * 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 |
| 136 * key for applying dashing and SkStrokeRec all at once. |
| 137 */ |
| 138 static void StyleKey(uint32_t*, const GrStyle&, bool stopAfterPE); |
| 139 |
| 140 /** Constructor used by Apply* functions */ |
| 141 GrShape(const GrShape& parentShape, bool stopAfterPE); |
| 142 |
| 143 /** |
| 144 * 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. |
| 146 */ |
| 147 void setInheritedKey(const GrShape& parentShape, bool stopAfterPE); |
| 148 |
| 149 enum class Type { |
| 150 kEmpty, |
| 151 kRRect, |
| 152 kPath, |
| 153 } fType; |
| 154 |
| 155 SkRRect fRRect; |
| 156 SkTLazy<SkPath> fPath; |
| 157 GrStyle fStyle; |
| 158 SkAutoSTArray<8, uint32_t> fInheritedKey; |
| 159 }; |
| 160 #endif |
OLD | NEW |