| 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 "SkColorFilter.h" | 10 #include "SkColorFilter.h" |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 | 66 |
| 67 SkPaint::SkPaint(const SkPaint& src) | 67 SkPaint::SkPaint(const SkPaint& src) |
| 68 #define COPY(field) field(src.field) | 68 #define COPY(field) field(src.field) |
| 69 : COPY(fTypeface) | 69 : COPY(fTypeface) |
| 70 , COPY(fPathEffect) | 70 , COPY(fPathEffect) |
| 71 , COPY(fShader) | 71 , COPY(fShader) |
| 72 , COPY(fXfermode) | 72 , COPY(fXfermode) |
| 73 , COPY(fMaskFilter) | 73 , COPY(fMaskFilter) |
| 74 , COPY(fColorFilter) | 74 , COPY(fColorFilter) |
| 75 , COPY(fRasterizer) | 75 , COPY(fRasterizer) |
| 76 , COPY(fLooper) | 76 , COPY(fDrawLooper) |
| 77 , COPY(fImageFilter) | 77 , COPY(fImageFilter) |
| 78 , COPY(fTextSize) | 78 , COPY(fTextSize) |
| 79 , COPY(fTextScaleX) | 79 , COPY(fTextScaleX) |
| 80 , COPY(fTextSkewX) | 80 , COPY(fTextSkewX) |
| 81 , COPY(fColor) | 81 , COPY(fColor) |
| 82 , COPY(fWidth) | 82 , COPY(fWidth) |
| 83 , COPY(fMiterLimit) | 83 , COPY(fMiterLimit) |
| 84 , COPY(fBitfields) | 84 , COPY(fBitfields) |
| 85 #undef COPY | 85 #undef COPY |
| 86 {} | 86 {} |
| 87 | 87 |
| 88 SkPaint::SkPaint(SkPaint&& src) { | 88 SkPaint::SkPaint(SkPaint&& src) { |
| 89 #define MOVE(field) field = std::move(src.field) | 89 #define MOVE(field) field = std::move(src.field) |
| 90 MOVE(fTypeface); | 90 MOVE(fTypeface); |
| 91 MOVE(fPathEffect); | 91 MOVE(fPathEffect); |
| 92 MOVE(fShader); | 92 MOVE(fShader); |
| 93 MOVE(fXfermode); | 93 MOVE(fXfermode); |
| 94 MOVE(fMaskFilter); | 94 MOVE(fMaskFilter); |
| 95 MOVE(fColorFilter); | 95 MOVE(fColorFilter); |
| 96 MOVE(fRasterizer); | 96 MOVE(fRasterizer); |
| 97 MOVE(fLooper); | 97 MOVE(fDrawLooper); |
| 98 MOVE(fImageFilter); | 98 MOVE(fImageFilter); |
| 99 MOVE(fTextSize); | 99 MOVE(fTextSize); |
| 100 MOVE(fTextScaleX); | 100 MOVE(fTextScaleX); |
| 101 MOVE(fTextSkewX); | 101 MOVE(fTextSkewX); |
| 102 MOVE(fColor); | 102 MOVE(fColor); |
| 103 MOVE(fWidth); | 103 MOVE(fWidth); |
| 104 MOVE(fMiterLimit); | 104 MOVE(fMiterLimit); |
| 105 MOVE(fBitfields); | 105 MOVE(fBitfields); |
| 106 #undef MOVE | 106 #undef MOVE |
| 107 } | 107 } |
| 108 | 108 |
| 109 SkPaint::~SkPaint() {} | 109 SkPaint::~SkPaint() {} |
| 110 | 110 |
| 111 SkPaint& SkPaint::operator=(const SkPaint& src) { | 111 SkPaint& SkPaint::operator=(const SkPaint& src) { |
| 112 if (this == &src) { | 112 if (this == &src) { |
| 113 return *this; | 113 return *this; |
| 114 } | 114 } |
| 115 | 115 |
| 116 #define ASSIGN(field) field = src.field | 116 #define ASSIGN(field) field = src.field |
| 117 ASSIGN(fTypeface); | 117 ASSIGN(fTypeface); |
| 118 ASSIGN(fPathEffect); | 118 ASSIGN(fPathEffect); |
| 119 ASSIGN(fShader); | 119 ASSIGN(fShader); |
| 120 ASSIGN(fXfermode); | 120 ASSIGN(fXfermode); |
| 121 ASSIGN(fMaskFilter); | 121 ASSIGN(fMaskFilter); |
| 122 ASSIGN(fColorFilter); | 122 ASSIGN(fColorFilter); |
| 123 ASSIGN(fRasterizer); | 123 ASSIGN(fRasterizer); |
| 124 ASSIGN(fLooper); | 124 ASSIGN(fDrawLooper); |
| 125 ASSIGN(fImageFilter); | 125 ASSIGN(fImageFilter); |
| 126 ASSIGN(fTextSize); | 126 ASSIGN(fTextSize); |
| 127 ASSIGN(fTextScaleX); | 127 ASSIGN(fTextScaleX); |
| 128 ASSIGN(fTextSkewX); | 128 ASSIGN(fTextSkewX); |
| 129 ASSIGN(fColor); | 129 ASSIGN(fColor); |
| 130 ASSIGN(fWidth); | 130 ASSIGN(fWidth); |
| 131 ASSIGN(fMiterLimit); | 131 ASSIGN(fMiterLimit); |
| 132 ASSIGN(fBitfields); | 132 ASSIGN(fBitfields); |
| 133 #undef ASSIGN | 133 #undef ASSIGN |
| 134 | 134 |
| 135 return *this; | 135 return *this; |
| 136 } | 136 } |
| 137 | 137 |
| 138 SkPaint& SkPaint::operator=(SkPaint&& src) { | 138 SkPaint& SkPaint::operator=(SkPaint&& src) { |
| 139 if (this == &src) { | 139 if (this == &src) { |
| 140 return *this; | 140 return *this; |
| 141 } | 141 } |
| 142 | 142 |
| 143 #define MOVE(field) field = std::move(src.field) | 143 #define MOVE(field) field = std::move(src.field) |
| 144 MOVE(fTypeface); | 144 MOVE(fTypeface); |
| 145 MOVE(fPathEffect); | 145 MOVE(fPathEffect); |
| 146 MOVE(fShader); | 146 MOVE(fShader); |
| 147 MOVE(fXfermode); | 147 MOVE(fXfermode); |
| 148 MOVE(fMaskFilter); | 148 MOVE(fMaskFilter); |
| 149 MOVE(fColorFilter); | 149 MOVE(fColorFilter); |
| 150 MOVE(fRasterizer); | 150 MOVE(fRasterizer); |
| 151 MOVE(fLooper); | 151 MOVE(fDrawLooper); |
| 152 MOVE(fImageFilter); | 152 MOVE(fImageFilter); |
| 153 MOVE(fTextSize); | 153 MOVE(fTextSize); |
| 154 MOVE(fTextScaleX); | 154 MOVE(fTextScaleX); |
| 155 MOVE(fTextSkewX); | 155 MOVE(fTextSkewX); |
| 156 MOVE(fColor); | 156 MOVE(fColor); |
| 157 MOVE(fWidth); | 157 MOVE(fWidth); |
| 158 MOVE(fMiterLimit); | 158 MOVE(fMiterLimit); |
| 159 MOVE(fBitfields); | 159 MOVE(fBitfields); |
| 160 #undef MOVE | 160 #undef MOVE |
| 161 | 161 |
| 162 return *this; | 162 return *this; |
| 163 } | 163 } |
| 164 | 164 |
| 165 bool operator==(const SkPaint& a, const SkPaint& b) { | 165 bool operator==(const SkPaint& a, const SkPaint& b) { |
| 166 #define EQUAL(field) (a.field == b.field) | 166 #define EQUAL(field) (a.field == b.field) |
| 167 return EQUAL(fTypeface) | 167 return EQUAL(fTypeface) |
| 168 && EQUAL(fPathEffect) | 168 && EQUAL(fPathEffect) |
| 169 && EQUAL(fShader) | 169 && EQUAL(fShader) |
| 170 && EQUAL(fXfermode) | 170 && EQUAL(fXfermode) |
| 171 && EQUAL(fMaskFilter) | 171 && EQUAL(fMaskFilter) |
| 172 && EQUAL(fColorFilter) | 172 && EQUAL(fColorFilter) |
| 173 && EQUAL(fRasterizer) | 173 && EQUAL(fRasterizer) |
| 174 && EQUAL(fLooper) | 174 && EQUAL(fDrawLooper) |
| 175 && EQUAL(fImageFilter) | 175 && EQUAL(fImageFilter) |
| 176 && EQUAL(fTextSize) | 176 && EQUAL(fTextSize) |
| 177 && EQUAL(fTextScaleX) | 177 && EQUAL(fTextScaleX) |
| 178 && EQUAL(fTextSkewX) | 178 && EQUAL(fTextSkewX) |
| 179 && EQUAL(fColor) | 179 && EQUAL(fColor) |
| 180 && EQUAL(fWidth) | 180 && EQUAL(fWidth) |
| 181 && EQUAL(fMiterLimit) | 181 && EQUAL(fMiterLimit) |
| 182 && EQUAL(fBitfieldsUInt) | 182 && EQUAL(fBitfieldsUInt) |
| 183 ; | 183 ; |
| 184 #undef EQUAL | 184 #undef EQUAL |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 | 356 |
| 357 #define MOVE_FIELD(Field) void SkPaint::set##Field(sk_sp<Sk##Field> f) { f##Fiel
d = std::move(f); } | 357 #define MOVE_FIELD(Field) void SkPaint::set##Field(sk_sp<Sk##Field> f) { f##Fiel
d = std::move(f); } |
| 358 MOVE_FIELD(Typeface) | 358 MOVE_FIELD(Typeface) |
| 359 MOVE_FIELD(Rasterizer) | 359 MOVE_FIELD(Rasterizer) |
| 360 MOVE_FIELD(ImageFilter) | 360 MOVE_FIELD(ImageFilter) |
| 361 MOVE_FIELD(Shader) | 361 MOVE_FIELD(Shader) |
| 362 MOVE_FIELD(ColorFilter) | 362 MOVE_FIELD(ColorFilter) |
| 363 MOVE_FIELD(Xfermode) | 363 MOVE_FIELD(Xfermode) |
| 364 MOVE_FIELD(PathEffect) | 364 MOVE_FIELD(PathEffect) |
| 365 MOVE_FIELD(MaskFilter) | 365 MOVE_FIELD(MaskFilter) |
| 366 MOVE_FIELD(DrawLooper) |
| 366 #undef MOVE_FIELD | 367 #undef MOVE_FIELD |
| 367 void SkPaint::setLooper(sk_sp<SkDrawLooper> looper) { fLooper = std::move(looper
); } | 368 void SkPaint::setLooper(sk_sp<SkDrawLooper> looper) { fDrawLooper = std::move(lo
oper); } |
| 368 | 369 |
| 369 #define SET_PTR(Field) \ | 370 #define SET_PTR(Field) \ |
| 370 Sk##Field* SkPaint::set##Field(Sk##Field* f) { \ | 371 Sk##Field* SkPaint::set##Field(Sk##Field* f) { \ |
| 371 this->f##Field.reset(SkSafeRef(f)); \ | 372 this->f##Field.reset(SkSafeRef(f)); \ |
| 372 return f; \ | 373 return f; \ |
| 373 } | 374 } |
| 374 #ifdef SK_SUPPORT_LEGACY_TYPEFACE_PTR | 375 #ifdef SK_SUPPORT_LEGACY_TYPEFACE_PTR |
| 375 SET_PTR(Typeface) | 376 SET_PTR(Typeface) |
| 376 #endif | 377 #endif |
| 377 #ifdef SK_SUPPORT_LEGACY_MINOR_EFFECT_PTR | 378 #ifdef SK_SUPPORT_LEGACY_MINOR_EFFECT_PTR |
| (...skipping 1974 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2352 } | 2353 } |
| 2353 | 2354 |
| 2354 // return true if the filter exists, and may affect alpha | 2355 // return true if the filter exists, and may affect alpha |
| 2355 static bool affects_alpha(const SkImageFilter* imf) { | 2356 static bool affects_alpha(const SkImageFilter* imf) { |
| 2356 // TODO: check if we should allow imagefilters to broadcast that they don't
affect alpha | 2357 // TODO: check if we should allow imagefilters to broadcast that they don't
affect alpha |
| 2357 // ala colorfilters | 2358 // ala colorfilters |
| 2358 return imf != nullptr; | 2359 return imf != nullptr; |
| 2359 } | 2360 } |
| 2360 | 2361 |
| 2361 bool SkPaint::nothingToDraw() const { | 2362 bool SkPaint::nothingToDraw() const { |
| 2362 if (fLooper) { | 2363 if (fDrawLooper) { |
| 2363 return false; | 2364 return false; |
| 2364 } | 2365 } |
| 2365 SkXfermode::Mode mode; | 2366 SkXfermode::Mode mode; |
| 2366 if (SkXfermode::AsMode(fXfermode.get(), &mode)) { | 2367 if (SkXfermode::AsMode(fXfermode.get(), &mode)) { |
| 2367 switch (mode) { | 2368 switch (mode) { |
| 2368 case SkXfermode::kSrcOver_Mode: | 2369 case SkXfermode::kSrcOver_Mode: |
| 2369 case SkXfermode::kSrcATop_Mode: | 2370 case SkXfermode::kSrcATop_Mode: |
| 2370 case SkXfermode::kDstOut_Mode: | 2371 case SkXfermode::kDstOut_Mode: |
| 2371 case SkXfermode::kDstOver_Mode: | 2372 case SkXfermode::kDstOver_Mode: |
| 2372 case SkXfermode::kPlus_Mode: | 2373 case SkXfermode::kPlus_Mode: |
| (...skipping 11 matching lines...) Expand all Loading... |
| 2384 } | 2385 } |
| 2385 | 2386 |
| 2386 uint32_t SkPaint::getHash() const { | 2387 uint32_t SkPaint::getHash() const { |
| 2387 // We're going to hash 10 pointers and 7 32-bit values, finishing up with fB
itfields, | 2388 // We're going to hash 10 pointers and 7 32-bit values, finishing up with fB
itfields, |
| 2388 // so fBitfields should be 10 pointers and 6 32-bit values from the start. | 2389 // so fBitfields should be 10 pointers and 6 32-bit values from the start. |
| 2389 static_assert(offsetof(SkPaint, fBitfields) == 9 * sizeof(void*) + 6 * sizeo
f(uint32_t), | 2390 static_assert(offsetof(SkPaint, fBitfields) == 9 * sizeof(void*) + 6 * sizeo
f(uint32_t), |
| 2390 "SkPaint_notPackedTightly"); | 2391 "SkPaint_notPackedTightly"); |
| 2391 return SkOpts::hash(reinterpret_cast<const uint32_t*>(this), | 2392 return SkOpts::hash(reinterpret_cast<const uint32_t*>(this), |
| 2392 offsetof(SkPaint, fBitfields) + sizeof(fBitfields)); | 2393 offsetof(SkPaint, fBitfields) + sizeof(fBitfields)); |
| 2393 } | 2394 } |
| OLD | NEW |