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