Index: src/core/SkPaint.cpp |
diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp |
index 9d76a169b39184c22d59c3789cf072aeef1d9110..17843496bbfe22a5ac90fcba953f8c533e63eb83 100644 |
--- a/src/core/SkPaint.cpp |
+++ b/src/core/SkPaint.cpp |
@@ -52,6 +52,7 @@ SkPaint::SkPaint() { |
fColor = SK_ColorBLACK; |
fWidth = 0; |
fMiterLimit = SkPaintDefaults_MiterLimit; |
+ fBlendMode = (unsigned)SkBlendMode::kSrcOver; |
// Zero all bitfields, then set some non-zero defaults. |
fBitfieldsUInt = 0; |
@@ -69,7 +70,6 @@ SkPaint::SkPaint(const SkPaint& src) |
: COPY(fTypeface) |
, COPY(fPathEffect) |
, COPY(fShader) |
- , COPY(fXfermode) |
, COPY(fMaskFilter) |
, COPY(fColorFilter) |
, COPY(fRasterizer) |
@@ -81,6 +81,7 @@ SkPaint::SkPaint(const SkPaint& src) |
, COPY(fColor) |
, COPY(fWidth) |
, COPY(fMiterLimit) |
+ , COPY(fBlendMode) |
, COPY(fBitfields) |
#undef COPY |
{} |
@@ -90,7 +91,6 @@ SkPaint::SkPaint(SkPaint&& src) { |
MOVE(fTypeface); |
MOVE(fPathEffect); |
MOVE(fShader); |
- MOVE(fXfermode); |
MOVE(fMaskFilter); |
MOVE(fColorFilter); |
MOVE(fRasterizer); |
@@ -102,6 +102,7 @@ SkPaint::SkPaint(SkPaint&& src) { |
MOVE(fColor); |
MOVE(fWidth); |
MOVE(fMiterLimit); |
+ MOVE(fBlendMode); |
MOVE(fBitfields); |
#undef MOVE |
} |
@@ -117,7 +118,6 @@ SkPaint& SkPaint::operator=(const SkPaint& src) { |
ASSIGN(fTypeface); |
ASSIGN(fPathEffect); |
ASSIGN(fShader); |
- ASSIGN(fXfermode); |
ASSIGN(fMaskFilter); |
ASSIGN(fColorFilter); |
ASSIGN(fRasterizer); |
@@ -129,6 +129,7 @@ SkPaint& SkPaint::operator=(const SkPaint& src) { |
ASSIGN(fColor); |
ASSIGN(fWidth); |
ASSIGN(fMiterLimit); |
+ ASSIGN(fBlendMode); |
ASSIGN(fBitfields); |
#undef ASSIGN |
@@ -144,7 +145,6 @@ SkPaint& SkPaint::operator=(SkPaint&& src) { |
MOVE(fTypeface); |
MOVE(fPathEffect); |
MOVE(fShader); |
- MOVE(fXfermode); |
MOVE(fMaskFilter); |
MOVE(fColorFilter); |
MOVE(fRasterizer); |
@@ -156,6 +156,7 @@ SkPaint& SkPaint::operator=(SkPaint&& src) { |
MOVE(fColor); |
MOVE(fWidth); |
MOVE(fMiterLimit); |
+ MOVE(fBlendMode); |
MOVE(fBitfields); |
#undef MOVE |
@@ -167,7 +168,6 @@ bool operator==(const SkPaint& a, const SkPaint& b) { |
return EQUAL(fTypeface) |
&& EQUAL(fPathEffect) |
&& EQUAL(fShader) |
- && EQUAL(fXfermode) |
&& EQUAL(fMaskFilter) |
&& EQUAL(fColorFilter) |
&& EQUAL(fRasterizer) |
@@ -179,6 +179,7 @@ bool operator==(const SkPaint& a, const SkPaint& b) { |
&& EQUAL(fColor) |
&& EQUAL(fWidth) |
&& EQUAL(fMiterLimit) |
+ && EQUAL(fBlendMode) |
&& EQUAL(fBitfieldsUInt) |
; |
#undef EQUAL |
@@ -360,7 +361,6 @@ MOVE_FIELD(Rasterizer) |
MOVE_FIELD(ImageFilter) |
MOVE_FIELD(Shader) |
MOVE_FIELD(ColorFilter) |
-MOVE_FIELD(Xfermode) |
MOVE_FIELD(PathEffect) |
MOVE_FIELD(MaskFilter) |
MOVE_FIELD(DrawLooper) |
@@ -386,7 +386,10 @@ SET_PTR(Shader) |
SET_PTR(ColorFilter) |
#endif |
#ifdef SK_SUPPORT_LEGACY_XFERMODE_PTR |
-SET_PTR(Xfermode) |
+SkXfermode* SkPaint::setXfermode(SkXfermode* xfer) { |
+ this->setBlendMode(xfer ? xfer->blend() : SkBlendMode::kSrcOver); |
+ return this->getXfermode(); |
+} |
#endif |
#ifdef SK_SUPPORT_LEGACY_PATHEFFECT_PTR |
SET_PTR(PathEffect) |
@@ -403,10 +406,18 @@ SkDrawLooper* SkPaint::setLooper(SkDrawLooper* looper) { |
} |
#endif |
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_OBJECT |
+void SkPaint::setXfermode(sk_sp<SkXfermode> mode) { |
+ this->setBlendMode(mode ? mode->blend() : SkBlendMode::kSrcOver); |
+} |
+SkXfermode* SkPaint::getXfermode() const { |
+ return SkXfermode::Peek((SkBlendMode)fBlendMode); |
+} |
SkXfermode* SkPaint::setXfermodeMode(SkXfermode::Mode mode) { |
- fXfermode = SkXfermode::Make(mode); |
- return fXfermode.get(); // can/should we change this API to be void, like the other setters? |
+ this->setBlendMode((SkBlendMode)mode); |
+ return SkXfermode::Peek((SkBlendMode)mode); |
} |
+#endif |
/////////////////////////////////////////////////////////////////////////////// |
@@ -1904,7 +1915,6 @@ void SkPaint::flatten(SkWriteBuffer& buffer) const { |
} |
if (asint(this->getPathEffect()) | |
asint(this->getShader()) | |
- asint(this->getXfermode()) | |
asint(this->getMaskFilter()) | |
asint(this->getColorFilter()) | |
asint(this->getRasterizer()) | |
@@ -1923,7 +1933,8 @@ void SkPaint::flatten(SkWriteBuffer& buffer) const { |
buffer.writeUInt(pack_paint_flags(this->getFlags(), this->getHinting(), this->getTextAlign(), |
this->getFilterQuality(), flatFlags)); |
buffer.writeUInt(pack_4(this->getStrokeCap(), this->getStrokeJoin(), |
- this->getStyle(), this->getTextEncoding())); |
+ (this->getStyle() << 4) | this->getTextEncoding(), |
+ fBlendMode)); |
// now we're done with ptr and the (pre)reserved space. If we need to write |
// additional fields, use the buffer directly |
@@ -1933,7 +1944,6 @@ void SkPaint::flatten(SkWriteBuffer& buffer) const { |
if (flatFlags & kHasEffects_FlatFlag) { |
buffer.writeFlattenable(this->getPathEffect()); |
buffer.writeFlattenable(this->getShader()); |
- buffer.writeFlattenable(this->getXfermode()); |
buffer.writeFlattenable(this->getMaskFilter()); |
buffer.writeFlattenable(this->getColorFilter()); |
buffer.writeFlattenable(this->getRasterizer()); |
@@ -1955,8 +1965,14 @@ void SkPaint::unflatten(SkReadBuffer& buffer) { |
uint32_t tmp = buffer.readUInt(); |
this->setStrokeCap(static_cast<Cap>((tmp >> 24) & 0xFF)); |
this->setStrokeJoin(static_cast<Join>((tmp >> 16) & 0xFF)); |
- this->setStyle(static_cast<Style>((tmp >> 8) & 0xFF)); |
- this->setTextEncoding(static_cast<TextEncoding>((tmp >> 0) & 0xFF)); |
+ if (buffer.isVersionLT(SkReadBuffer::kXfermodeToBlendMode_Version)) { |
+ this->setStyle(static_cast<Style>((tmp >> 8) & 0xFF)); |
+ this->setTextEncoding(static_cast<TextEncoding>((tmp >> 0) & 0xFF)); |
+ } else { |
+ this->setStyle(static_cast<Style>((tmp >> 12) & 0xF)); |
+ this->setTextEncoding(static_cast<TextEncoding>((tmp >> 8) & 0xF)); |
+ this->setBlendMode((SkBlendMode)(tmp & 0xFF)); |
+ } |
if (flatFlags & kHasTypeface_FlatFlag) { |
this->setTypeface(buffer.readTypeface()); |
@@ -1967,7 +1983,10 @@ void SkPaint::unflatten(SkReadBuffer& buffer) { |
if (flatFlags & kHasEffects_FlatFlag) { |
this->setPathEffect(buffer.readPathEffect()); |
this->setShader(buffer.readShader()); |
- this->setXfermode(buffer.readXfermode()); |
+ if (buffer.isVersionLT(SkReadBuffer::kXfermodeToBlendMode_Version)) { |
+ sk_sp<SkXfermode> xfer = buffer.readXfermode(); |
+ this->setBlendMode(xfer ? xfer->blend() : SkBlendMode::kSrcOver); |
+ } |
this->setMaskFilter(buffer.readMaskFilter()); |
this->setColorFilter(buffer.readColorFilter()); |
this->setRasterizer(buffer.readRasterizer()); |
@@ -1986,7 +2005,6 @@ void SkPaint::unflatten(SkReadBuffer& buffer) { |
} else { |
this->setPathEffect(nullptr); |
this->setShader(nullptr); |
- this->setXfermode(nullptr); |
this->setMaskFilter(nullptr); |
this->setColorFilter(nullptr); |
this->setRasterizer(nullptr); |
@@ -2116,11 +2134,8 @@ void SkPaint::toString(SkString* str) const { |
str->append("</dd>"); |
} |
- SkXfermode* xfer = this->getXfermode(); |
- if (xfer) { |
- str->append("<dt>Xfermode:</dt><dd>"); |
- xfer->toString(str); |
- str->append("</dd>"); |
+ if (!this->isSrcOver()) { |
+ str->appendf("<dt>Xfermode:</dt><dd>%d</dd>", fBlendMode); |
} |
SkMaskFilter* maskFilter = this->getMaskFilter(); |
@@ -2363,23 +2378,20 @@ bool SkPaint::nothingToDraw() const { |
if (fDrawLooper) { |
return false; |
} |
- SkXfermode::Mode mode; |
- if (SkXfermode::AsMode(fXfermode.get(), &mode)) { |
- switch (mode) { |
- case SkXfermode::kSrcOver_Mode: |
- case SkXfermode::kSrcATop_Mode: |
- case SkXfermode::kDstOut_Mode: |
- case SkXfermode::kDstOver_Mode: |
- case SkXfermode::kPlus_Mode: |
- if (0 == this->getAlpha()) { |
- return !affects_alpha(fColorFilter.get()) && !affects_alpha(fImageFilter.get()); |
- } |
- break; |
- case SkXfermode::kDst_Mode: |
- return true; |
- default: |
- break; |
- } |
+ switch ((SkBlendMode)fBlendMode) { |
+ case SkBlendMode::kSrcOver: |
+ case SkBlendMode::kSrcATop: |
+ case SkBlendMode::kDstOut: |
+ case SkBlendMode::kDstOver: |
+ case SkBlendMode::kPlus: |
+ if (0 == this->getAlpha()) { |
+ return !affects_alpha(fColorFilter.get()) && !affects_alpha(fImageFilter.get()); |
+ } |
+ break; |
+ case SkBlendMode::kDst: |
+ return true; |
+ default: |
+ break; |
} |
return false; |
} |
@@ -2387,7 +2399,7 @@ bool SkPaint::nothingToDraw() const { |
uint32_t SkPaint::getHash() const { |
// We're going to hash 10 pointers and 7 32-bit values, finishing up with fBitfields, |
// so fBitfields should be 10 pointers and 6 32-bit values from the start. |
- static_assert(offsetof(SkPaint, fBitfields) == 9 * sizeof(void*) + 6 * sizeof(uint32_t), |
+ static_assert(offsetof(SkPaint, fBitfields) == 8 * sizeof(void*) + 7 * sizeof(uint32_t), |
"SkPaint_notPackedTightly"); |
return SkOpts::hash(reinterpret_cast<const uint32_t*>(this), |
offsetof(SkPaint, fBitfields) + sizeof(fBitfields)); |