OLD | NEW |
---|---|
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 #include "SkPaint.h" | 9 #include "SkPaint.h" |
10 #include "SkAnnotation.h" | 10 #include "SkAnnotation.h" |
(...skipping 17 matching lines...) Expand all Loading... | |
28 #include "SkScalerContext.h" | 28 #include "SkScalerContext.h" |
29 #include "SkShader.h" | 29 #include "SkShader.h" |
30 #include "SkStringUtils.h" | 30 #include "SkStringUtils.h" |
31 #include "SkStroke.h" | 31 #include "SkStroke.h" |
32 #include "SkTextFormatParams.h" | 32 #include "SkTextFormatParams.h" |
33 #include "SkTextToPathIter.h" | 33 #include "SkTextToPathIter.h" |
34 #include "SkTLazy.h" | 34 #include "SkTLazy.h" |
35 #include "SkTypeface.h" | 35 #include "SkTypeface.h" |
36 #include "SkXfermode.h" | 36 #include "SkXfermode.h" |
37 | 37 |
38 bool SkPaintParts::operator==(const SkPaintParts& other) const { | |
mtklein
2014/04/15 14:32:44
Give him his own .cpp?
reed1
2014/04/18 14:04:31
Eventually yes.
| |
39 #define EQUAL(field) (this->field == other.field) | |
40 return EQUAL(fTypeface) | |
41 && EQUAL(fPathEffect) | |
42 && EQUAL(fShader) | |
43 && EQUAL(fXfermode) | |
44 && EQUAL(fMaskFilter) | |
45 && EQUAL(fColorFilter) | |
46 && EQUAL(fRasterizer) | |
47 && EQUAL(fLooper) | |
48 && EQUAL(fImageFilter) | |
49 && EQUAL(fAnnotation) | |
50 && EQUAL(fTextSize) | |
51 && EQUAL(fTextScaleX) | |
52 && EQUAL(fTextSkewX) | |
53 && EQUAL(fColor) | |
54 && EQUAL(fWidth) | |
55 && EQUAL(fMiterLimit) | |
56 && EQUAL(fBitfields) | |
57 ; | |
58 #undef EQUAL | |
59 } | |
60 | |
61 /////////// | |
62 | |
63 | |
38 enum { | 64 enum { |
39 kColor_DirtyBit = 1 << 0, | 65 kColor_DirtyBit = 1 << 0, |
40 kBitfields_DirtyBit = 1 << 1, | 66 kBitfields_DirtyBit = 1 << 1, |
41 kTextSize_DirtyBit = 1 << 2, | 67 kTextSize_DirtyBit = 1 << 2, |
42 kTextScaleX_DirtyBit = 1 << 3, | 68 kTextScaleX_DirtyBit = 1 << 3, |
43 kTextSkewX_DirtyBit = 1 << 4, | 69 kTextSkewX_DirtyBit = 1 << 4, |
44 kStrokeWidth_DirtyBit = 1 << 5, | 70 kStrokeWidth_DirtyBit = 1 << 5, |
45 kStrokeMiter_DirtyBit = 1 << 6, | 71 kStrokeMiter_DirtyBit = 1 << 6, |
46 kPathEffect_DirtyBit = 1 << 7, | 72 kPathEffect_DirtyBit = 1 << 7, |
47 kShader_DirtyBit = 1 << 8, | 73 kShader_DirtyBit = 1 << 8, |
(...skipping 14 matching lines...) Expand all Loading... | |
62 | 88 |
63 #ifdef SK_BUILD_FOR_ANDROID | 89 #ifdef SK_BUILD_FOR_ANDROID |
64 #define GEN_ID_INC fGenerationID++ | 90 #define GEN_ID_INC fGenerationID++ |
65 #define GEN_ID_INC_EVAL(expression) if (expression) { fGenerationID++; } | 91 #define GEN_ID_INC_EVAL(expression) if (expression) { fGenerationID++; } |
66 #else | 92 #else |
67 #define GEN_ID_INC | 93 #define GEN_ID_INC |
68 #define GEN_ID_INC_EVAL(expression) | 94 #define GEN_ID_INC_EVAL(expression) |
69 #endif | 95 #endif |
70 | 96 |
71 SkPaint::SkPaint() { | 97 SkPaint::SkPaint() { |
72 fTypeface = NULL; | 98 // set any non-zero values in fParts |
73 fPathEffect = NULL; | |
74 fShader = NULL; | |
75 fXfermode = NULL; | |
76 fMaskFilter = NULL; | |
77 fColorFilter = NULL; | |
78 fRasterizer = NULL; | |
79 fLooper = NULL; | |
80 fImageFilter = NULL; | |
81 fAnnotation = NULL; | |
82 | 99 |
83 fTextSize = SkPaintDefaults_TextSize; | 100 fParts.fTextSize = SkPaintDefaults_TextSize; |
84 fTextScaleX = SK_Scalar1; | 101 fParts.fTextScaleX = SK_Scalar1; |
85 fTextSkewX = 0; | 102 fParts.fColor = SK_ColorBLACK; |
86 fColor = SK_ColorBLACK; | 103 fParts.fMiterLimit = SkPaintDefaults_MiterLimit; |
87 fWidth = 0; | |
88 fMiterLimit = SkPaintDefaults_MiterLimit; | |
89 | 104 |
90 // Zero all bitfields, then set some non-zero defaults. | 105 fParts.fFlags = SkPaintDefaults_Flags; |
91 fBitfields = 0; | 106 fParts.fCapType = SkPaintParts::kDefault_Cap; |
92 fFlags = SkPaintDefaults_Flags; | 107 fParts.fJoinType = SkPaintParts::kDefault_Join; |
93 fCapType = kDefault_Cap; | 108 fParts.fTextAlign = SkPaintParts::kLeft_Align; |
94 fJoinType = kDefault_Join; | 109 fParts.fStyle = SkPaintParts::kFill_Style; |
95 fTextAlign = kLeft_Align; | 110 fParts.fTextEncoding = kUTF8_TextEncoding; |
96 fStyle = kFill_Style; | 111 fParts.fHinting = SkPaintDefaults_Hinting; |
97 fTextEncoding = kUTF8_TextEncoding; | |
98 fHinting = SkPaintDefaults_Hinting; | |
99 | 112 |
100 fDirtyBits = 0; | 113 fDirtyBits = 0; |
101 #ifdef SK_BUILD_FOR_ANDROID | 114 #ifdef SK_BUILD_FOR_ANDROID |
102 new (&fPaintOptionsAndroid) SkPaintOptionsAndroid; | 115 new (&fPaintOptionsAndroid) SkPaintOptionsAndroid; |
103 fGenerationID = 0; | 116 fGenerationID = 0; |
104 #endif | 117 #endif |
105 } | 118 } |
106 | 119 |
107 SkPaint::SkPaint(const SkPaint& src) { | 120 SkPaint::SkPaint(const SkPaint& src) { |
108 #define COPY(field) field = src.field | 121 #define COPY(field) fParts.field = src.fParts.field |
109 #define REF_COPY(field) field = SkSafeRef(src.field) | 122 #define REF_COPY(field) fParts.field = SkSafeRef(src.fParts.field) |
110 | 123 |
tomhudson
2014/04/16 11:41:31
operator= asserts that the argument isn't *(NULL).
| |
111 REF_COPY(fTypeface); | 124 REF_COPY(fTypeface); |
112 REF_COPY(fPathEffect); | 125 REF_COPY(fPathEffect); |
113 REF_COPY(fShader); | 126 REF_COPY(fShader); |
114 REF_COPY(fXfermode); | 127 REF_COPY(fXfermode); |
115 REF_COPY(fMaskFilter); | 128 REF_COPY(fMaskFilter); |
116 REF_COPY(fColorFilter); | 129 REF_COPY(fColorFilter); |
117 REF_COPY(fRasterizer); | 130 REF_COPY(fRasterizer); |
118 REF_COPY(fLooper); | 131 REF_COPY(fLooper); |
119 REF_COPY(fImageFilter); | 132 REF_COPY(fImageFilter); |
120 REF_COPY(fAnnotation); | 133 REF_COPY(fAnnotation); |
121 | 134 |
122 COPY(fTextSize); | 135 COPY(fTextSize); |
123 COPY(fTextScaleX); | 136 COPY(fTextScaleX); |
124 COPY(fTextSkewX); | 137 COPY(fTextSkewX); |
125 COPY(fColor); | 138 COPY(fColor); |
126 COPY(fWidth); | 139 COPY(fWidth); |
127 COPY(fMiterLimit); | 140 COPY(fMiterLimit); |
128 COPY(fBitfields); | 141 COPY(fBitfields); |
129 COPY(fDirtyBits); | 142 |
143 fDirtyBits = src.fDirtyBits; | |
130 | 144 |
131 #ifdef SK_BUILD_FOR_ANDROID | 145 #ifdef SK_BUILD_FOR_ANDROID |
132 new (&fPaintOptionsAndroid) SkPaintOptionsAndroid(src.fPaintOptionsAndroid); | 146 new (&fPaintOptionsAndroid) SkPaintOptionsAndroid(src.fPaintOptionsAndroid); |
133 COPY(fGenerationID); | 147 COPY(fGenerationID); |
134 #endif | 148 #endif |
135 | 149 |
136 #undef COPY | 150 #undef COPY |
137 #undef REF_COPY | 151 #undef REF_COPY |
138 } | 152 } |
139 | 153 |
140 SkPaint::~SkPaint() { | 154 SkPaint::~SkPaint() { |
141 SkSafeUnref(fTypeface); | 155 SkSafeUnref(fParts.fTypeface); |
142 SkSafeUnref(fPathEffect); | 156 SkSafeUnref(fParts.fPathEffect); |
143 SkSafeUnref(fShader); | 157 SkSafeUnref(fParts.fShader); |
144 SkSafeUnref(fXfermode); | 158 SkSafeUnref(fParts.fXfermode); |
145 SkSafeUnref(fMaskFilter); | 159 SkSafeUnref(fParts.fMaskFilter); |
146 SkSafeUnref(fColorFilter); | 160 SkSafeUnref(fParts.fColorFilter); |
147 SkSafeUnref(fRasterizer); | 161 SkSafeUnref(fParts.fRasterizer); |
148 SkSafeUnref(fLooper); | 162 SkSafeUnref(fParts.fLooper); |
149 SkSafeUnref(fImageFilter); | 163 SkSafeUnref(fParts.fImageFilter); |
150 SkSafeUnref(fAnnotation); | 164 SkSafeUnref(fParts.fAnnotation); |
151 } | 165 } |
152 | 166 |
153 SkPaint& SkPaint::operator=(const SkPaint& src) { | 167 SkPaint& SkPaint::operator=(const SkPaint& src) { |
154 #define COPY(field) field = src.field | 168 #define COPY(field) fParts.field = src.fParts.field |
155 #define REF_COPY(field) SkSafeUnref(field); field = SkSafeRef(src.field) | 169 #define REF_COPY(field) SkSafeUnref(fParts.field); fParts.field = SkSafeRef(src. fParts.field) |
156 | 170 |
157 SkASSERT(&src); | 171 SkASSERT(&src); |
158 | 172 |
159 REF_COPY(fTypeface); | 173 REF_COPY(fTypeface); |
160 REF_COPY(fPathEffect); | 174 REF_COPY(fPathEffect); |
161 REF_COPY(fShader); | 175 REF_COPY(fShader); |
162 REF_COPY(fXfermode); | 176 REF_COPY(fXfermode); |
163 REF_COPY(fMaskFilter); | 177 REF_COPY(fMaskFilter); |
164 REF_COPY(fColorFilter); | 178 REF_COPY(fColorFilter); |
165 REF_COPY(fRasterizer); | 179 REF_COPY(fRasterizer); |
166 REF_COPY(fLooper); | 180 REF_COPY(fLooper); |
167 REF_COPY(fImageFilter); | 181 REF_COPY(fImageFilter); |
168 REF_COPY(fAnnotation); | 182 REF_COPY(fAnnotation); |
169 | 183 |
170 COPY(fTextSize); | 184 COPY(fTextSize); |
171 COPY(fTextScaleX); | 185 COPY(fTextScaleX); |
172 COPY(fTextSkewX); | 186 COPY(fTextSkewX); |
173 COPY(fColor); | 187 COPY(fColor); |
174 COPY(fWidth); | 188 COPY(fWidth); |
175 COPY(fMiterLimit); | 189 COPY(fMiterLimit); |
176 COPY(fBitfields); | 190 COPY(fBitfields); |
177 COPY(fDirtyBits); | 191 |
192 fDirtyBits = src.fDirtyBits; | |
178 | 193 |
179 #ifdef SK_BUILD_FOR_ANDROID | 194 #ifdef SK_BUILD_FOR_ANDROID |
180 fPaintOptionsAndroid.~SkPaintOptionsAndroid(); | 195 fPaintOptionsAndroid.~SkPaintOptionsAndroid(); |
181 new (&fPaintOptionsAndroid) SkPaintOptionsAndroid(src.fPaintOptionsAndroid); | 196 new (&fPaintOptionsAndroid) SkPaintOptionsAndroid(src.fPaintOptionsAndroid); |
182 ++fGenerationID; | 197 ++fGenerationID; |
183 #endif | 198 #endif |
184 | 199 |
185 return *this; | 200 return *this; |
186 | 201 |
187 #undef COPY | 202 #undef COPY |
188 #undef REF_COPY | 203 #undef REF_COPY |
189 } | 204 } |
190 | 205 |
191 bool operator==(const SkPaint& a, const SkPaint& b) { | 206 bool operator==(const SkPaint& a, const SkPaint& b) { |
192 #define EQUAL(field) (a.field == b.field) | 207 if (a.fParts != b.fParts) { |
193 // Don't check fGenerationID or fDirtyBits, which can be different for logic ally equal paints. | 208 return false; |
194 return EQUAL(fTypeface) | 209 } |
195 && EQUAL(fPathEffect) | |
196 && EQUAL(fShader) | |
197 && EQUAL(fXfermode) | |
198 && EQUAL(fMaskFilter) | |
199 && EQUAL(fColorFilter) | |
200 && EQUAL(fRasterizer) | |
201 && EQUAL(fLooper) | |
202 && EQUAL(fImageFilter) | |
203 && EQUAL(fAnnotation) | |
204 && EQUAL(fTextSize) | |
205 && EQUAL(fTextScaleX) | |
206 && EQUAL(fTextSkewX) | |
207 && EQUAL(fColor) | |
208 && EQUAL(fWidth) | |
209 && EQUAL(fMiterLimit) | |
210 && EQUAL(fBitfields) | |
211 #ifdef SK_BUILD_FOR_ANDROID | 210 #ifdef SK_BUILD_FOR_ANDROID |
212 && EQUAL(fPaintOptionsAndroid) | 211 if (fPaintOptionsAndroid != b.fPaintOptionsAndroid) { |
mtklein
2014/04/15 14:32:44
It makes me very happy that these are not moving i
| |
212 return false; | |
213 } | |
213 #endif | 214 #endif |
214 ; | 215 return true; |
215 #undef EQUAL | |
216 } | 216 } |
217 | 217 |
218 void SkPaint::reset() { | 218 void SkPaint::reset() { |
219 SkPaint init; | 219 SkPaint init; |
220 | 220 |
221 #ifdef SK_BUILD_FOR_ANDROID | 221 #ifdef SK_BUILD_FOR_ANDROID |
222 uint32_t oldGenerationID = fGenerationID; | 222 uint32_t oldGenerationID = fGenerationID; |
223 #endif | 223 #endif |
224 *this = init; | 224 *this = init; |
225 #ifdef SK_BUILD_FOR_ANDROID | 225 #ifdef SK_BUILD_FOR_ANDROID |
(...skipping 2458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2684 } | 2684 } |
2685 #ifdef SK_BUILD_FOR_ANDROID | 2685 #ifdef SK_BUILD_FOR_ANDROID |
2686 if (dirty & kPaintOptionsAndroid_DirtyBit) { | 2686 if (dirty & kPaintOptionsAndroid_DirtyBit) { |
2687 SkPaintOptionsAndroid options; | 2687 SkPaintOptionsAndroid options; |
2688 options.unflatten(buffer); | 2688 options.unflatten(buffer); |
2689 paint->setPaintOptionsAndroid(options); | 2689 paint->setPaintOptionsAndroid(options); |
2690 } | 2690 } |
2691 #endif | 2691 #endif |
2692 SkASSERT(dirty == paint->fDirtyBits); | 2692 SkASSERT(dirty == paint->fDirtyBits); |
2693 } | 2693 } |
OLD | NEW |