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

Side by Side Diff: src/core/SkPaint.cpp

Issue 239163002: WIP -- separate out Parts from SkPaint (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 6 years, 8 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 | Annotate | Revision Log
« include/core/SkPaintParts.h ('K') | « include/core/SkPaintParts.h ('k') | no next file » | 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 /* 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
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
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
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 }
OLDNEW
« include/core/SkPaintParts.h ('K') | « include/core/SkPaintParts.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698