OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
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 #include "SkPaint.h" | 8 #include "SkPaint.h" |
9 #include "SkAutoKern.h" | 9 #include "SkAutoKern.h" |
10 #include "SkChecksum.h" | 10 #include "SkChecksum.h" |
(...skipping 26 matching lines...) Expand all Loading... | |
37 | 37 |
38 static inline uint32_t set_clear_mask(uint32_t bits, bool cond, uint32_t mask) { | 38 static inline uint32_t set_clear_mask(uint32_t bits, bool cond, uint32_t mask) { |
39 return cond ? bits | mask : bits & ~mask; | 39 return cond ? bits | mask : bits & ~mask; |
40 } | 40 } |
41 | 41 |
42 // define this to get a printf for out-of-range parameter in setters | 42 // define this to get a printf for out-of-range parameter in setters |
43 // e.g. setTextSize(-1) | 43 // e.g. setTextSize(-1) |
44 //#define SK_REPORT_API_RANGE_CHECK | 44 //#define SK_REPORT_API_RANGE_CHECK |
45 | 45 |
46 SkPaint::SkPaint() { | 46 SkPaint::SkPaint() { |
47 fTypeface = nullptr; | |
48 fPathEffect = nullptr; | |
49 fShader = nullptr; | |
50 fXfermode = nullptr; | |
51 fMaskFilter = nullptr; | |
52 fColorFilter = nullptr; | |
53 fRasterizer = nullptr; | |
54 fLooper = nullptr; | |
55 fImageFilter = nullptr; | |
56 | |
57 fTextSize = SkPaintDefaults_TextSize; | 47 fTextSize = SkPaintDefaults_TextSize; |
58 fTextScaleX = SK_Scalar1; | 48 fTextScaleX = SK_Scalar1; |
59 fTextSkewX = 0; | 49 fTextSkewX = 0; |
60 fColor = SK_ColorBLACK; | 50 fColor = SK_ColorBLACK; |
61 fWidth = 0; | 51 fWidth = 0; |
62 fMiterLimit = SkPaintDefaults_MiterLimit; | 52 fMiterLimit = SkPaintDefaults_MiterLimit; |
63 | 53 |
64 // Zero all bitfields, then set some non-zero defaults. | 54 // Zero all bitfields, then set some non-zero defaults. |
65 fBitfieldsUInt = 0; | 55 fBitfieldsUInt = 0; |
66 fBitfields.fFlags = SkPaintDefaults_Flags; | 56 fBitfields.fFlags = SkPaintDefaults_Flags; |
67 fBitfields.fCapType = kDefault_Cap; | 57 fBitfields.fCapType = kDefault_Cap; |
68 fBitfields.fJoinType = kDefault_Join; | 58 fBitfields.fJoinType = kDefault_Join; |
69 fBitfields.fTextAlign = kLeft_Align; | 59 fBitfields.fTextAlign = kLeft_Align; |
70 fBitfields.fStyle = kFill_Style; | 60 fBitfields.fStyle = kFill_Style; |
71 fBitfields.fTextEncoding = kUTF8_TextEncoding; | 61 fBitfields.fTextEncoding = kUTF8_TextEncoding; |
72 fBitfields.fHinting = SkPaintDefaults_Hinting; | 62 fBitfields.fHinting = SkPaintDefaults_Hinting; |
73 } | 63 } |
74 | 64 |
75 SkPaint::SkPaint(const SkPaint& src) { | 65 SkPaint::SkPaint(const SkPaint& src) |
66 #define COPY_CTR(field) field(src.field) | |
bungeman-skia
2016/03/06 04:50:05
Note that for simplicity and uniformity, COPY_CTR
reed1
2016/03/06 20:06:17
Agreed about unity. I think CTR is clearer (to me)
| |
67 : COPY_CTR(fTypeface) | |
68 , COPY_CTR(fPathEffect) | |
69 , COPY_CTR(fShader) | |
70 , COPY_CTR(fXfermode) | |
71 , COPY_CTR(fMaskFilter) | |
72 , COPY_CTR(fColorFilter) | |
73 , COPY_CTR(fRasterizer) | |
74 , COPY_CTR(fLooper) | |
75 , COPY_CTR(fImageFilter) | |
76 { | |
76 #define COPY(field) field = src.field | 77 #define COPY(field) field = src.field |
77 #define REF_COPY(field) field = SkSafeRef(src.field) | |
78 | |
79 REF_COPY(fTypeface); | |
80 REF_COPY(fPathEffect); | |
81 REF_COPY(fShader); | |
82 REF_COPY(fXfermode); | |
83 REF_COPY(fMaskFilter); | |
84 REF_COPY(fColorFilter); | |
85 REF_COPY(fRasterizer); | |
86 REF_COPY(fLooper); | |
87 REF_COPY(fImageFilter); | |
88 | |
89 COPY(fTextSize); | 78 COPY(fTextSize); |
90 COPY(fTextScaleX); | 79 COPY(fTextScaleX); |
91 COPY(fTextSkewX); | 80 COPY(fTextSkewX); |
92 COPY(fColor); | 81 COPY(fColor); |
93 COPY(fWidth); | 82 COPY(fWidth); |
94 COPY(fMiterLimit); | 83 COPY(fMiterLimit); |
95 COPY(fBitfields); | 84 COPY(fBitfields); |
96 | 85 |
97 #undef COPY | 86 #undef COPY |
98 #undef REF_COPY | 87 #undef COPY_CTR |
99 } | 88 } |
100 | 89 |
101 SkPaint::SkPaint(SkPaint&& src) { | 90 SkPaint::SkPaint(SkPaint&& src) { |
102 #define MOVE(field) field = std::move(src.field) | 91 #define MOVE(field) field = std::move(src.field) |
103 #define REF_MOVE(field) field = src.field; src.field = nullptr | 92 #define REF_MOVE(field) field = src.field; src.field = nullptr |
bungeman-skia
2016/03/06 04:50:05
REF_MOVE needs to be removed and all the REF_MOVE
bungeman-skia
2016/03/06 14:03:40
I shouldn't write these things so late at night. O
reed1
2016/03/06 20:06:17
Doh! I inverted the intended use. Will move all of
| |
104 | 93 |
105 REF_MOVE(fTypeface); | 94 REF_MOVE(fTypeface); |
106 REF_MOVE(fPathEffect); | 95 REF_MOVE(fPathEffect); |
107 REF_MOVE(fShader); | 96 REF_MOVE(fShader); |
108 REF_MOVE(fXfermode); | 97 REF_MOVE(fXfermode); |
109 REF_MOVE(fMaskFilter); | 98 REF_MOVE(fMaskFilter); |
110 REF_MOVE(fColorFilter); | 99 REF_MOVE(fColorFilter); |
111 REF_MOVE(fRasterizer); | 100 REF_MOVE(fRasterizer); |
112 REF_MOVE(fLooper); | 101 REF_MOVE(fLooper); |
113 REF_MOVE(fImageFilter); | 102 REF_MOVE(fImageFilter); |
114 | 103 |
115 MOVE(fTextSize); | 104 MOVE(fTextSize); |
116 MOVE(fTextScaleX); | 105 MOVE(fTextScaleX); |
117 MOVE(fTextSkewX); | 106 MOVE(fTextSkewX); |
118 MOVE(fColor); | 107 MOVE(fColor); |
119 MOVE(fWidth); | 108 MOVE(fWidth); |
120 MOVE(fMiterLimit); | 109 MOVE(fMiterLimit); |
121 MOVE(fBitfields); | 110 MOVE(fBitfields); |
122 | 111 |
123 #undef MOVE | 112 #undef MOVE |
124 #undef REF_MOVE | 113 #undef REF_MOVE |
125 } | 114 } |
126 | 115 |
127 SkPaint::~SkPaint() { | 116 SkPaint::~SkPaint() {} |
128 SkSafeUnref(fTypeface); | |
129 SkSafeUnref(fPathEffect); | |
130 SkSafeUnref(fShader); | |
131 SkSafeUnref(fXfermode); | |
132 SkSafeUnref(fMaskFilter); | |
133 SkSafeUnref(fColorFilter); | |
134 SkSafeUnref(fRasterizer); | |
135 SkSafeUnref(fLooper); | |
136 SkSafeUnref(fImageFilter); | |
137 } | |
138 | 117 |
139 SkPaint& SkPaint::operator=(const SkPaint& src) { | 118 SkPaint& SkPaint::operator=(const SkPaint& src) { |
140 if (this == &src) { | 119 if (this == &src) { |
141 return *this; | 120 return *this; |
142 } | 121 } |
143 | 122 |
144 #define COPY(field) field = src.field | 123 #define COPY(field) field = src.field |
145 #define REF_COPY(field) SkSafeUnref(field); field = SkSafeRef(src.field) | |
146 | 124 |
147 REF_COPY(fTypeface); | 125 COPY(fTypeface); |
148 REF_COPY(fPathEffect); | 126 COPY(fPathEffect); |
149 REF_COPY(fShader); | 127 COPY(fShader); |
150 REF_COPY(fXfermode); | 128 COPY(fXfermode); |
151 REF_COPY(fMaskFilter); | 129 COPY(fMaskFilter); |
152 REF_COPY(fColorFilter); | 130 COPY(fColorFilter); |
153 REF_COPY(fRasterizer); | 131 COPY(fRasterizer); |
154 REF_COPY(fLooper); | 132 COPY(fLooper); |
155 REF_COPY(fImageFilter); | 133 COPY(fImageFilter); |
156 | |
157 COPY(fTextSize); | 134 COPY(fTextSize); |
158 COPY(fTextScaleX); | 135 COPY(fTextScaleX); |
159 COPY(fTextSkewX); | 136 COPY(fTextSkewX); |
160 COPY(fColor); | 137 COPY(fColor); |
161 COPY(fWidth); | 138 COPY(fWidth); |
162 COPY(fMiterLimit); | 139 COPY(fMiterLimit); |
163 COPY(fBitfields); | 140 COPY(fBitfields); |
164 | 141 |
165 return *this; | 142 return *this; |
166 | 143 |
167 #undef COPY | 144 #undef COPY |
168 #undef REF_COPY | |
169 } | 145 } |
170 | 146 |
171 SkPaint& SkPaint::operator=(SkPaint&& src) { | 147 SkPaint& SkPaint::operator=(SkPaint&& src) { |
172 if (this == &src) { | 148 if (this == &src) { |
173 return *this; | 149 return *this; |
174 } | 150 } |
175 | 151 |
176 #define MOVE(field) field = std::move(src.field) | 152 #define MOVE(field) field = std::move(src.field) |
177 #define REF_MOVE(field) SkSafeUnref(field); field = src.field; src.field = nullp tr | |
178 | 153 |
179 REF_MOVE(fTypeface); | 154 MOVE(fTypeface); |
180 REF_MOVE(fPathEffect); | 155 MOVE(fPathEffect); |
181 REF_MOVE(fShader); | 156 MOVE(fShader); |
182 REF_MOVE(fXfermode); | 157 MOVE(fXfermode); |
183 REF_MOVE(fMaskFilter); | 158 MOVE(fMaskFilter); |
184 REF_MOVE(fColorFilter); | 159 MOVE(fColorFilter); |
185 REF_MOVE(fRasterizer); | 160 MOVE(fRasterizer); |
186 REF_MOVE(fLooper); | 161 MOVE(fLooper); |
187 REF_MOVE(fImageFilter); | 162 MOVE(fImageFilter); |
188 | |
189 MOVE(fTextSize); | 163 MOVE(fTextSize); |
190 MOVE(fTextScaleX); | 164 MOVE(fTextScaleX); |
191 MOVE(fTextSkewX); | 165 MOVE(fTextSkewX); |
192 MOVE(fColor); | 166 MOVE(fColor); |
193 MOVE(fWidth); | 167 MOVE(fWidth); |
194 MOVE(fMiterLimit); | 168 MOVE(fMiterLimit); |
195 MOVE(fBitfields); | 169 MOVE(fBitfields); |
196 | 170 |
197 return *this; | 171 return *this; |
198 | 172 |
199 #undef MOVE | 173 #undef MOVE |
200 #undef REF_MOVE | |
201 } | 174 } |
202 | 175 |
203 bool operator==(const SkPaint& a, const SkPaint& b) { | 176 bool operator==(const SkPaint& a, const SkPaint& b) { |
204 #define EQUAL(field) (a.field == b.field) | 177 #define EQUAL(field) (a.field == b.field) |
205 return EQUAL(fTypeface) | 178 return EQUAL(fTypeface) |
206 && EQUAL(fPathEffect) | 179 && EQUAL(fPathEffect) |
207 && EQUAL(fShader) | 180 && EQUAL(fShader) |
208 && EQUAL(fXfermode) | 181 && EQUAL(fXfermode) |
209 && EQUAL(fMaskFilter) | 182 && EQUAL(fMaskFilter) |
210 && EQUAL(fColorFilter) | 183 && EQUAL(fColorFilter) |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
385 fBitfields.fTextEncoding = encoding; | 358 fBitfields.fTextEncoding = encoding; |
386 } else { | 359 } else { |
387 #ifdef SK_REPORT_API_RANGE_CHECK | 360 #ifdef SK_REPORT_API_RANGE_CHECK |
388 SkDebugf("SkPaint::setTextEncoding(%d) out of range\n", encoding); | 361 SkDebugf("SkPaint::setTextEncoding(%d) out of range\n", encoding); |
389 #endif | 362 #endif |
390 } | 363 } |
391 } | 364 } |
392 | 365 |
393 /////////////////////////////////////////////////////////////////////////////// | 366 /////////////////////////////////////////////////////////////////////////////// |
394 | 367 |
395 SkTypeface* SkPaint::setTypeface(SkTypeface* font) { | 368 #define MOVE_FIELD(Field) void SkPaint::set##Field(sk_sp<Sk##Field> f) { f##Fiel d = std::move(f); } |
396 SkRefCnt_SafeAssign(fTypeface, font); | 369 MOVE_FIELD(Typeface) |
397 return font; | 370 MOVE_FIELD(Rasterizer) |
398 } | 371 MOVE_FIELD(ImageFilter) |
372 MOVE_FIELD(Shader) | |
373 MOVE_FIELD(ColorFilter) | |
374 MOVE_FIELD(Xfermode) | |
375 MOVE_FIELD(PathEffect) | |
376 MOVE_FIELD(MaskFilter) | |
377 #undef MOVE_FIELD | |
378 void SkPaint::setLooper(sk_sp<SkDrawLooper> looper) { fLooper = std::move(looper ); } | |
399 | 379 |
400 SkRasterizer* SkPaint::setRasterizer(SkRasterizer* r) { | 380 #define SET_PTR(Field) \ |
401 SkRefCnt_SafeAssign(fRasterizer, r); | 381 Sk##Field* SkPaint::set##Field(Sk##Field* f) { \ |
402 return r; | 382 this->f##Field.reset(SkSafeRef(f)); \ |
403 } | 383 return f; \ |
384 } | |
385 SET_PTR(Typeface) | |
386 SET_PTR(Rasterizer) | |
387 SET_PTR(ImageFilter) | |
388 SET_PTR(Shader) | |
389 SET_PTR(ColorFilter) | |
390 SET_PTR(Xfermode) | |
391 SET_PTR(PathEffect) | |
392 SET_PTR(MaskFilter) | |
393 #undef SET_PTR | |
404 | 394 |
405 SkDrawLooper* SkPaint::setLooper(SkDrawLooper* looper) { | 395 SkDrawLooper* SkPaint::setLooper(SkDrawLooper* looper) { |
406 SkRefCnt_SafeAssign(fLooper, looper); | 396 fLooper.reset(SkSafeRef(looper)); |
407 return looper; | 397 return looper; |
408 } | 398 } |
409 | 399 |
410 SkImageFilter* SkPaint::setImageFilter(SkImageFilter* imageFilter) { | 400 SkXfermode* SkPaint::setXfermodeMode(SkXfermode::Mode mode) { |
411 SkRefCnt_SafeAssign(fImageFilter, imageFilter); | 401 fXfermode.reset(SkXfermode::Create(mode)); |
412 return imageFilter; | 402 return fXfermode.get(); |
413 } | 403 } |
414 | 404 |
415 /////////////////////////////////////////////////////////////////////////////// | 405 /////////////////////////////////////////////////////////////////////////////// |
416 | 406 |
417 static SkScalar mag2(SkScalar x, SkScalar y) { | 407 static SkScalar mag2(SkScalar x, SkScalar y) { |
418 return x * x + y * y; | 408 return x * x + y * y; |
419 } | 409 } |
420 | 410 |
421 static bool tooBig(const SkMatrix& m, SkScalar ma2max) { | 411 static bool tooBig(const SkMatrix& m, SkScalar ma2max) { |
422 return mag2(m[SkMatrix::kMScaleX], m[SkMatrix::kMSkewY]) > ma2max | 412 return mag2(m[SkMatrix::kMScaleX], m[SkMatrix::kMSkewY]) > ma2max |
(...skipping 1296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1719 SkDescriptor* desc = ad.getDesc(); | 1709 SkDescriptor* desc = ad.getDesc(); |
1720 | 1710 |
1721 write_out_descriptor(desc, rec, pe, &peBuffer, mf, &mfBuffer, ra, &raBuffer, descSize); | 1711 write_out_descriptor(desc, rec, pe, &peBuffer, mf, &mfBuffer, ra, &raBuffer, descSize); |
1722 | 1712 |
1723 SkASSERT(descSize == desc->getLength()); | 1713 SkASSERT(descSize == desc->getLength()); |
1724 | 1714 |
1725 #ifdef TEST_DESC | 1715 #ifdef TEST_DESC |
1726 test_desc(rec, pe, &peBuffer, mf, &mfBuffer, ra, &raBuffer, desc, descSize); | 1716 test_desc(rec, pe, &peBuffer, mf, &mfBuffer, ra, &raBuffer, desc, descSize); |
1727 #endif | 1717 #endif |
1728 | 1718 |
1729 proc(fTypeface, desc, context); | 1719 proc(fTypeface.get(), desc, context); |
1730 } | 1720 } |
1731 | 1721 |
1732 SkGlyphCache* SkPaint::detachCache(const SkSurfaceProps* surfaceProps, | 1722 SkGlyphCache* SkPaint::detachCache(const SkSurfaceProps* surfaceProps, |
1733 FakeGamma fakeGamma, | 1723 FakeGamma fakeGamma, |
1734 const SkMatrix* deviceMatrix) const { | 1724 const SkMatrix* deviceMatrix) const { |
1735 SkGlyphCache* cache; | 1725 SkGlyphCache* cache; |
1736 this->descriptorProc(surfaceProps, fakeGamma, deviceMatrix, DetachDescProc, &cache); | 1726 this->descriptorProc(surfaceProps, fakeGamma, deviceMatrix, DetachDescProc, &cache); |
1737 return cache; | 1727 return cache; |
1738 } | 1728 } |
1739 | 1729 |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1976 this->setMaskFilter(nullptr); | 1966 this->setMaskFilter(nullptr); |
1977 this->setColorFilter(nullptr); | 1967 this->setColorFilter(nullptr); |
1978 this->setRasterizer(nullptr); | 1968 this->setRasterizer(nullptr); |
1979 this->setLooper(nullptr); | 1969 this->setLooper(nullptr); |
1980 this->setImageFilter(nullptr); | 1970 this->setImageFilter(nullptr); |
1981 } | 1971 } |
1982 } | 1972 } |
1983 | 1973 |
1984 /////////////////////////////////////////////////////////////////////////////// | 1974 /////////////////////////////////////////////////////////////////////////////// |
1985 | 1975 |
1986 SkShader* SkPaint::setShader(SkShader* shader) { | |
1987 SkRefCnt_SafeAssign(fShader, shader); | |
1988 return shader; | |
1989 } | |
1990 | |
1991 SkColorFilter* SkPaint::setColorFilter(SkColorFilter* filter) { | |
1992 SkRefCnt_SafeAssign(fColorFilter, filter); | |
1993 return filter; | |
1994 } | |
1995 | |
1996 SkXfermode* SkPaint::setXfermode(SkXfermode* mode) { | |
1997 SkRefCnt_SafeAssign(fXfermode, mode); | |
1998 return mode; | |
1999 } | |
2000 | |
2001 SkXfermode* SkPaint::setXfermodeMode(SkXfermode::Mode mode) { | |
2002 SkSafeUnref(fXfermode); | |
2003 fXfermode = SkXfermode::Create(mode); | |
2004 return fXfermode; | |
2005 } | |
2006 | |
2007 SkPathEffect* SkPaint::setPathEffect(SkPathEffect* effect) { | |
2008 SkRefCnt_SafeAssign(fPathEffect, effect); | |
2009 return effect; | |
2010 } | |
2011 | |
2012 SkMaskFilter* SkPaint::setMaskFilter(SkMaskFilter* filter) { | |
2013 SkRefCnt_SafeAssign(fMaskFilter, filter); | |
2014 return filter; | |
2015 } | |
2016 | |
2017 /////////////////////////////////////////////////////////////////////////////// | |
2018 | |
2019 bool SkPaint::getFillPath(const SkPath& src, SkPath* dst, const SkRect* cullRect , | 1976 bool SkPaint::getFillPath(const SkPath& src, SkPath* dst, const SkRect* cullRect , |
2020 SkScalar resScale) const { | 1977 SkScalar resScale) const { |
2021 SkStrokeRec rec(*this, resScale); | 1978 SkStrokeRec rec(*this, resScale); |
2022 | 1979 |
2023 const SkPath* srcPtr = &src; | 1980 const SkPath* srcPtr = &src; |
2024 SkPath tmpPath; | 1981 SkPath tmpPath; |
2025 | 1982 |
2026 if (fPathEffect && fPathEffect->filterPath(&tmpPath, src, &rec, cullRect)) { | 1983 if (fPathEffect && fPathEffect->filterPath(&tmpPath, src, &rec, cullRect)) { |
2027 srcPtr = &tmpPath; | 1984 srcPtr = &tmpPath; |
2028 } | 1985 } |
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2386 // TODO: check if we should allow imagefilters to broadcast that they don't affect alpha | 2343 // TODO: check if we should allow imagefilters to broadcast that they don't affect alpha |
2387 // ala colorfilters | 2344 // ala colorfilters |
2388 return imf != nullptr; | 2345 return imf != nullptr; |
2389 } | 2346 } |
2390 | 2347 |
2391 bool SkPaint::nothingToDraw() const { | 2348 bool SkPaint::nothingToDraw() const { |
2392 if (fLooper) { | 2349 if (fLooper) { |
2393 return false; | 2350 return false; |
2394 } | 2351 } |
2395 SkXfermode::Mode mode; | 2352 SkXfermode::Mode mode; |
2396 if (SkXfermode::AsMode(fXfermode, &mode)) { | 2353 if (SkXfermode::AsMode(fXfermode.get(), &mode)) { |
2397 switch (mode) { | 2354 switch (mode) { |
2398 case SkXfermode::kSrcOver_Mode: | 2355 case SkXfermode::kSrcOver_Mode: |
2399 case SkXfermode::kSrcATop_Mode: | 2356 case SkXfermode::kSrcATop_Mode: |
2400 case SkXfermode::kDstOut_Mode: | 2357 case SkXfermode::kDstOut_Mode: |
2401 case SkXfermode::kDstOver_Mode: | 2358 case SkXfermode::kDstOver_Mode: |
2402 case SkXfermode::kPlus_Mode: | 2359 case SkXfermode::kPlus_Mode: |
2403 if (0 == this->getAlpha()) { | 2360 if (0 == this->getAlpha()) { |
2404 return !affects_alpha(fColorFilter) && !affects_alpha(fImage Filter); | 2361 return !affects_alpha(fColorFilter.get()) && !affects_alpha( fImageFilter.get()); |
2405 } | 2362 } |
2406 break; | 2363 break; |
2407 case SkXfermode::kDst_Mode: | 2364 case SkXfermode::kDst_Mode: |
2408 return true; | 2365 return true; |
2409 default: | 2366 default: |
2410 break; | 2367 break; |
2411 } | 2368 } |
2412 } | 2369 } |
2413 return false; | 2370 return false; |
2414 } | 2371 } |
2415 | 2372 |
2416 uint32_t SkPaint::getHash() const { | 2373 uint32_t SkPaint::getHash() const { |
2417 // We're going to hash 10 pointers and 7 32-bit values, finishing up with fB itfields, | 2374 // We're going to hash 10 pointers and 7 32-bit values, finishing up with fB itfields, |
2418 // so fBitfields should be 10 pointers and 6 32-bit values from the start. | 2375 // so fBitfields should be 10 pointers and 6 32-bit values from the start. |
2419 static_assert(offsetof(SkPaint, fBitfields) == 9 * sizeof(void*) + 6 * sizeo f(uint32_t), | 2376 static_assert(offsetof(SkPaint, fBitfields) == 9 * sizeof(void*) + 6 * sizeo f(uint32_t), |
2420 "SkPaint_notPackedTightly"); | 2377 "SkPaint_notPackedTightly"); |
2421 return SkChecksum::Murmur3(reinterpret_cast<const uint32_t*>(this), | 2378 return SkChecksum::Murmur3(reinterpret_cast<const uint32_t*>(this), |
2422 offsetof(SkPaint, fBitfields) + sizeof(fBitfields )); | 2379 offsetof(SkPaint, fBitfields) + sizeof(fBitfields )); |
2423 } | 2380 } |
OLD | NEW |