Index: src/core/SkPaint.cpp |
diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp |
index 6b20629f79e96304a9c5ca317700fdad0dbbab00..cdfb1104544eb15690ac5037057a570fcb3b4eb6 100644 |
--- a/src/core/SkPaint.cpp |
+++ b/src/core/SkPaint.cpp |
@@ -44,6 +44,16 @@ |
//#define SK_REPORT_API_RANGE_CHECK |
SkPaint::SkPaint() { |
+ fTypeface = nullptr; |
+ fPathEffect = nullptr; |
+ fShader = nullptr; |
+ fXfermode = nullptr; |
+ fMaskFilter = nullptr; |
+ fColorFilter = nullptr; |
+ fRasterizer = nullptr; |
+ fLooper = nullptr; |
+ fImageFilter = nullptr; |
+ |
fTextSize = SkPaintDefaults_TextSize; |
fTextScaleX = SK_Scalar1; |
fTextSkewX = 0; |
@@ -62,19 +72,20 @@ |
fBitfields.fHinting = SkPaintDefaults_Hinting; |
} |
-SkPaint::SkPaint(const SkPaint& src) |
-#define COPY_CTR(field) field(src.field) |
- : COPY_CTR(fTypeface) |
- , COPY_CTR(fPathEffect) |
- , COPY_CTR(fShader) |
- , COPY_CTR(fXfermode) |
- , COPY_CTR(fMaskFilter) |
- , COPY_CTR(fColorFilter) |
- , COPY_CTR(fRasterizer) |
- , COPY_CTR(fLooper) |
- , COPY_CTR(fImageFilter) |
-{ |
+SkPaint::SkPaint(const SkPaint& src) { |
#define COPY(field) field = src.field |
+#define REF_COPY(field) field = SkSafeRef(src.field) |
+ |
+ REF_COPY(fTypeface); |
+ REF_COPY(fPathEffect); |
+ REF_COPY(fShader); |
+ REF_COPY(fXfermode); |
+ REF_COPY(fMaskFilter); |
+ REF_COPY(fColorFilter); |
+ REF_COPY(fRasterizer); |
+ REF_COPY(fLooper); |
+ REF_COPY(fImageFilter); |
+ |
COPY(fTextSize); |
COPY(fTextScaleX); |
COPY(fTextSkewX); |
@@ -84,7 +95,7 @@ |
COPY(fBitfields); |
#undef COPY |
-#undef COPY_CTR |
+#undef REF_COPY |
} |
SkPaint::SkPaint(SkPaint&& src) { |
@@ -113,7 +124,17 @@ |
#undef REF_MOVE |
} |
-SkPaint::~SkPaint() {} |
+SkPaint::~SkPaint() { |
+ SkSafeUnref(fTypeface); |
+ SkSafeUnref(fPathEffect); |
+ SkSafeUnref(fShader); |
+ SkSafeUnref(fXfermode); |
+ SkSafeUnref(fMaskFilter); |
+ SkSafeUnref(fColorFilter); |
+ SkSafeUnref(fRasterizer); |
+ SkSafeUnref(fLooper); |
+ SkSafeUnref(fImageFilter); |
+} |
SkPaint& SkPaint::operator=(const SkPaint& src) { |
if (this == &src) { |
@@ -121,16 +142,18 @@ |
} |
#define COPY(field) field = src.field |
- |
- COPY(fTypeface); |
- COPY(fPathEffect); |
- COPY(fShader); |
- COPY(fXfermode); |
- COPY(fMaskFilter); |
- COPY(fColorFilter); |
- COPY(fRasterizer); |
- COPY(fLooper); |
- COPY(fImageFilter); |
+#define REF_COPY(field) SkSafeUnref(field); field = SkSafeRef(src.field) |
+ |
+ REF_COPY(fTypeface); |
+ REF_COPY(fPathEffect); |
+ REF_COPY(fShader); |
+ REF_COPY(fXfermode); |
+ REF_COPY(fMaskFilter); |
+ REF_COPY(fColorFilter); |
+ REF_COPY(fRasterizer); |
+ REF_COPY(fLooper); |
+ REF_COPY(fImageFilter); |
+ |
COPY(fTextSize); |
COPY(fTextScaleX); |
COPY(fTextSkewX); |
@@ -142,6 +165,7 @@ |
return *this; |
#undef COPY |
+#undef REF_COPY |
} |
SkPaint& SkPaint::operator=(SkPaint&& src) { |
@@ -150,16 +174,18 @@ |
} |
#define MOVE(field) field = std::move(src.field) |
- |
- MOVE(fTypeface); |
- MOVE(fPathEffect); |
- MOVE(fShader); |
- MOVE(fXfermode); |
- MOVE(fMaskFilter); |
- MOVE(fColorFilter); |
- MOVE(fRasterizer); |
- MOVE(fLooper); |
- MOVE(fImageFilter); |
+#define REF_MOVE(field) SkSafeUnref(field); field = src.field; src.field = nullptr |
+ |
+ REF_MOVE(fTypeface); |
+ REF_MOVE(fPathEffect); |
+ REF_MOVE(fShader); |
+ REF_MOVE(fXfermode); |
+ REF_MOVE(fMaskFilter); |
+ REF_MOVE(fColorFilter); |
+ REF_MOVE(fRasterizer); |
+ REF_MOVE(fLooper); |
+ REF_MOVE(fImageFilter); |
+ |
MOVE(fTextSize); |
MOVE(fTextScaleX); |
MOVE(fTextSkewX); |
@@ -171,6 +197,7 @@ |
return *this; |
#undef MOVE |
+#undef REF_MOVE |
} |
bool operator==(const SkPaint& a, const SkPaint& b) { |
@@ -365,41 +392,24 @@ |
/////////////////////////////////////////////////////////////////////////////// |
-#define MOVE_FIELD(Field) void SkPaint::set##Field(sk_sp<Sk##Field> f) { f##Field = std::move(f); } |
-MOVE_FIELD(Typeface) |
-MOVE_FIELD(Rasterizer) |
-MOVE_FIELD(ImageFilter) |
-MOVE_FIELD(Shader) |
-MOVE_FIELD(ColorFilter) |
-MOVE_FIELD(Xfermode) |
-MOVE_FIELD(PathEffect) |
-MOVE_FIELD(MaskFilter) |
-#undef MOVE_FIELD |
-void SkPaint::setLooper(sk_sp<SkDrawLooper> looper) { fLooper = std::move(looper); } |
- |
-#define SET_PTR(Field) \ |
- Sk##Field* SkPaint::set##Field(Sk##Field* f) { \ |
- this->f##Field.reset(SkSafeRef(f)); \ |
- return f; \ |
- } |
-SET_PTR(Typeface) |
-SET_PTR(Rasterizer) |
-SET_PTR(ImageFilter) |
-SET_PTR(Shader) |
-SET_PTR(ColorFilter) |
-SET_PTR(Xfermode) |
-SET_PTR(PathEffect) |
-SET_PTR(MaskFilter) |
-#undef SET_PTR |
+SkTypeface* SkPaint::setTypeface(SkTypeface* font) { |
+ SkRefCnt_SafeAssign(fTypeface, font); |
+ return font; |
+} |
+ |
+SkRasterizer* SkPaint::setRasterizer(SkRasterizer* r) { |
+ SkRefCnt_SafeAssign(fRasterizer, r); |
+ return r; |
+} |
SkDrawLooper* SkPaint::setLooper(SkDrawLooper* looper) { |
- fLooper.reset(SkSafeRef(looper)); |
+ SkRefCnt_SafeAssign(fLooper, looper); |
return looper; |
} |
-SkXfermode* SkPaint::setXfermodeMode(SkXfermode::Mode mode) { |
- fXfermode.reset(SkXfermode::Create(mode)); |
- return fXfermode.get(); |
+SkImageFilter* SkPaint::setImageFilter(SkImageFilter* imageFilter) { |
+ SkRefCnt_SafeAssign(fImageFilter, imageFilter); |
+ return imageFilter; |
} |
/////////////////////////////////////////////////////////////////////////////// |
@@ -1716,7 +1726,7 @@ |
test_desc(rec, pe, &peBuffer, mf, &mfBuffer, ra, &raBuffer, desc, descSize); |
#endif |
- proc(fTypeface.get(), desc, context); |
+ proc(fTypeface, desc, context); |
} |
SkGlyphCache* SkPaint::detachCache(const SkSurfaceProps* surfaceProps, |
@@ -1969,6 +1979,39 @@ |
this->setLooper(nullptr); |
this->setImageFilter(nullptr); |
} |
+} |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
+SkShader* SkPaint::setShader(SkShader* shader) { |
+ SkRefCnt_SafeAssign(fShader, shader); |
+ return shader; |
+} |
+ |
+SkColorFilter* SkPaint::setColorFilter(SkColorFilter* filter) { |
+ SkRefCnt_SafeAssign(fColorFilter, filter); |
+ return filter; |
+} |
+ |
+SkXfermode* SkPaint::setXfermode(SkXfermode* mode) { |
+ SkRefCnt_SafeAssign(fXfermode, mode); |
+ return mode; |
+} |
+ |
+SkXfermode* SkPaint::setXfermodeMode(SkXfermode::Mode mode) { |
+ SkSafeUnref(fXfermode); |
+ fXfermode = SkXfermode::Create(mode); |
+ return fXfermode; |
+} |
+ |
+SkPathEffect* SkPaint::setPathEffect(SkPathEffect* effect) { |
+ SkRefCnt_SafeAssign(fPathEffect, effect); |
+ return effect; |
+} |
+ |
+SkMaskFilter* SkPaint::setMaskFilter(SkMaskFilter* filter) { |
+ SkRefCnt_SafeAssign(fMaskFilter, filter); |
+ return filter; |
} |
/////////////////////////////////////////////////////////////////////////////// |
@@ -2350,7 +2393,7 @@ |
return false; |
} |
SkXfermode::Mode mode; |
- if (SkXfermode::AsMode(fXfermode.get(), &mode)) { |
+ if (SkXfermode::AsMode(fXfermode, &mode)) { |
switch (mode) { |
case SkXfermode::kSrcOver_Mode: |
case SkXfermode::kSrcATop_Mode: |
@@ -2358,7 +2401,7 @@ |
case SkXfermode::kDstOver_Mode: |
case SkXfermode::kPlus_Mode: |
if (0 == this->getAlpha()) { |
- return !affects_alpha(fColorFilter.get()) && !affects_alpha(fImageFilter.get()); |
+ return !affects_alpha(fColorFilter) && !affects_alpha(fImageFilter); |
} |
break; |
case SkXfermode::kDst_Mode: |