From 1834242ec6e3cd62669227d394bc79e1cd66dcfb Mon Sep 17 00:00:00 2001 From: Mike Reed Date: Tue, 4 Oct 2016 10:06:20 -0400 Subject: Revert[4] "replace SkXfermode obj with SkBlendMode enum in paints" This reverts commit 2cbcd12281ee807214df094964c584c78932e10b. BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2924 Change-Id: I0fa5c58af428f3da8565465d1219a34ef8417d9a Reviewed-on: https://skia-review.googlesource.com/2924 Reviewed-by: Mike Reed Commit-Queue: Mike Reed --- src/core/SkBitmapDevice.cpp | 2 +- src/core/SkBlendModePriv.h | 19 +++++++ src/core/SkBlitter.cpp | 16 +++--- src/core/SkBlitter_A8.cpp | 9 ++-- src/core/SkBlitter_ARGB32.cpp | 4 +- src/core/SkBlitter_PM4f.cpp | 4 +- src/core/SkBlitter_RGB16.cpp | 14 +++-- src/core/SkBlitter_Sprite.cpp | 20 +++----- src/core/SkCanvas.cpp | 19 +++---- src/core/SkDraw.cpp | 21 ++++---- src/core/SkGpuBlurUtils.cpp | 8 +-- src/core/SkImageFilter.cpp | 2 +- src/core/SkMatrixImageFilter.cpp | 2 +- src/core/SkPaint.cpp | 96 +++++++++++++++++++++-------------- src/core/SkPaintPriv.cpp | 2 +- src/core/SkPixmap.cpp | 2 +- src/core/SkRasterPipelineBlitter.cpp | 6 +-- src/core/SkReadBuffer.h | 1 + src/core/SkRecordDraw.cpp | 41 +++++++-------- src/core/SkRecordOpts.cpp | 14 ++--- src/core/SkSpriteBlitter4f.cpp | 2 +- src/core/SkSpriteBlitter_ARGB32.cpp | 10 ++-- src/core/SkSpriteBlitter_RGB16.cpp | 2 +- src/core/SkXfermode.cpp | 61 ++++++++++++++++++++++ src/core/SkXfermodeInterpretation.cpp | 25 ++++----- 25 files changed, 230 insertions(+), 172 deletions(-) create mode 100644 src/core/SkBlendModePriv.h (limited to 'src/core') diff --git a/src/core/SkBitmapDevice.cpp b/src/core/SkBitmapDevice.cpp index 440de68345..26d253cf38 100644 --- a/src/core/SkBitmapDevice.cpp +++ b/src/core/SkBitmapDevice.cpp @@ -446,7 +446,7 @@ bool SkBitmapDevice::onShouldDisableLCD(const SkPaint& paint) const { paint.getPathEffect() || paint.isFakeBoldText() || paint.getStyle() != SkPaint::kFill_Style || - !SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode)) + !paint.isSrcOver()) { return true; } diff --git a/src/core/SkBlendModePriv.h b/src/core/SkBlendModePriv.h new file mode 100644 index 0000000000..b5d9e751e6 --- /dev/null +++ b/src/core/SkBlendModePriv.h @@ -0,0 +1,19 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkBlendModePriv_DEFINED +#define SkBlendModePriv_DEFINED + +#include "SkBlendMode.h" + +bool SkBlendMode_SupportsCoverageAsAlpha(SkBlendMode); + +#if SK_SUPPORT_GPU +sk_sp SkBlendMode_AsXPFactory(SkBlendMode); +#endif + +#endif diff --git a/src/core/SkBlitter.cpp b/src/core/SkBlitter.cpp index b57bd43ad0..3643e66760 100644 --- a/src/core/SkBlitter.cpp +++ b/src/core/SkBlitter.cpp @@ -815,7 +815,7 @@ SkBlitter* SkBlitter::Choose(const SkPixmap& device, SkShader* shader = origPaint.getShader(); SkColorFilter* cf = origPaint.getColorFilter(); - SkXfermode* mode = origPaint.getXfermode(); + SkBlendMode mode = origPaint.getBlendMode(); sk_sp shader3D; SkTCopyOnFirstWrite paint(origPaint); @@ -828,12 +828,12 @@ SkBlitter* SkBlitter::Choose(const SkPixmap& device, shader = shader3D.get(); } - if (mode) { + if (mode != SkBlendMode::kSrcOver) { bool deviceIsOpaque = kRGB_565_SkColorType == device.colorType(); switch (SkInterpretXfermode(*paint, deviceIsOpaque)) { case kSrcOver_SkXfermodeInterpretation: - mode = nullptr; - paint.writable()->setXfermode(nullptr); + mode = SkBlendMode::kSrcOver; + paint.writable()->setBlendMode(mode); break; case kSkipDrawing_SkXfermodeInterpretation:{ return allocator->createT(); @@ -848,13 +848,13 @@ SkBlitter* SkBlitter::Choose(const SkPixmap& device, * color/shader/colorfilter, and just pretend we're SRC + color==0. This * will fall into our optimizations for SRC mode. */ - if (SkXfermode::IsMode(mode, SkXfermode::kClear_Mode)) { + if (mode == SkBlendMode::kClear) { SkPaint* p = paint.writable(); p->setShader(nullptr); shader = nullptr; p->setColorFilter(nullptr); cf = nullptr; - mode = p->setXfermodeMode(SkXfermode::kSrc_Mode); + p->setBlendMode(mode = SkBlendMode::kSrc); p->setColor(0); } @@ -863,7 +863,7 @@ SkBlitter* SkBlitter::Choose(const SkPixmap& device, } if (nullptr == shader) { - if (mode) { + if (mode != SkBlendMode::kSrcOver) { // xfermodes (and filters) require shaders for our current blitters paint.writable()->setShader(SkShader::MakeColorShader(paint->getColor())); paint.writable()->setAlpha(0xFF); @@ -914,7 +914,7 @@ SkBlitter* SkBlitter::Choose(const SkPixmap& device, case kAlpha_8_SkColorType: if (drawCoverage) { SkASSERT(nullptr == shader); - SkASSERT(nullptr == paint->getXfermode()); + SkASSERT(paint->isSrcOver()); blitter = allocator->createT(device, *paint); } else if (shader) { blitter = allocator->createT(device, *paint, shaderContext); diff --git a/src/core/SkBlitter_A8.cpp b/src/core/SkBlitter_A8.cpp index 66976143c8..cb7d718f54 100644 --- a/src/core/SkBlitter_A8.cpp +++ b/src/core/SkBlitter_A8.cpp @@ -230,10 +230,8 @@ SkA8_Shader_Blitter::SkA8_Shader_Blitter(const SkPixmap& device, const SkPaint& SkShader::Context* shaderContext) : INHERITED(device, paint, shaderContext) { - if ((fXfermode = paint.getXfermode()) != nullptr) { - fXfermode->ref(); - SkASSERT(fShaderContext); - } + fXfermode = SkXfermode::Peek(paint.getBlendMode()); + SkASSERT(!fXfermode || fShaderContext); int width = device.width(); fBuffer = (SkPMColor*)sk_malloc_throw(sizeof(SkPMColor) * (width + (SkAlign4(width) >> 2))); @@ -241,7 +239,6 @@ SkA8_Shader_Blitter::SkA8_Shader_Blitter(const SkPixmap& device, const SkPaint& } SkA8_Shader_Blitter::~SkA8_Shader_Blitter() { - if (fXfermode) SkSafeUnref(fXfermode); sk_free(fBuffer); } @@ -355,7 +352,7 @@ void SkA8_Shader_Blitter::blitMask(const SkMask& mask, const SkIRect& clip) { SkA8_Coverage_Blitter::SkA8_Coverage_Blitter(const SkPixmap& device, const SkPaint& paint) : SkRasterBlitter(device) { SkASSERT(nullptr == paint.getShader()); - SkASSERT(nullptr == paint.getXfermode()); + SkASSERT(paint.isSrcOver()); SkASSERT(nullptr == paint.getColorFilter()); } diff --git a/src/core/SkBlitter_ARGB32.cpp b/src/core/SkBlitter_ARGB32.cpp index aada0586a4..ea0554d66e 100644 --- a/src/core/SkBlitter_ARGB32.cpp +++ b/src/core/SkBlitter_ARGB32.cpp @@ -339,8 +339,7 @@ SkARGB32_Shader_Blitter::SkARGB32_Shader_Blitter(const SkPixmap& device, { fBuffer = (SkPMColor*)sk_malloc_throw(device.width() * (sizeof(SkPMColor))); - fXfermode = paint.getXfermode(); - SkSafeRef(fXfermode); + fXfermode = SkXfermode::Peek(paint.getBlendMode()); int flags = 0; if (!(shaderContext->getFlags() & SkShader::kOpaqueAlpha_Flag)) { @@ -370,7 +369,6 @@ SkARGB32_Shader_Blitter::SkARGB32_Shader_Blitter(const SkPixmap& device, } SkARGB32_Shader_Blitter::~SkARGB32_Shader_Blitter() { - SkSafeUnref(fXfermode); sk_free(fBuffer); } diff --git a/src/core/SkBlitter_PM4f.cpp b/src/core/SkBlitter_PM4f.cpp index 455a97b95d..d63e924e2c 100644 --- a/src/core/SkBlitter_PM4f.cpp +++ b/src/core/SkBlitter_PM4f.cpp @@ -325,7 +325,7 @@ static bool is_opaque(const SkPaint& paint, const SkShader::Context* shaderConte struct State4f { State4f(const SkImageInfo& info, const SkPaint& paint, const SkShader::Context* shaderContext) { - fXfer = paint.getXfermode(); + fXfer = SkXfermode::Peek(paint.getBlendMode()); if (shaderContext) { fBuffer.reset(info.width()); } else { @@ -410,7 +410,7 @@ template SkBlitter* create(const SkPixmap& device, const SkPain SkShader::Context::BlitState bstate; sk_bzero(&bstate, sizeof(bstate)); bstate.fCtx = shaderContext; - bstate.fXfer = paint.getXfermode(); + bstate.fXfer = SkXfermode::Peek(paint.getBlendMode()); (void)shaderContext->chooseBlitProcs(device.info(), &bstate); return allocator->createT>(device, paint, bstate); diff --git a/src/core/SkBlitter_RGB16.cpp b/src/core/SkBlitter_RGB16.cpp index 066ec616de..7860b7cb6c 100644 --- a/src/core/SkBlitter_RGB16.cpp +++ b/src/core/SkBlitter_RGB16.cpp @@ -160,7 +160,7 @@ SkRGB16_Black_Blitter::SkRGB16_Black_Blitter(const SkPixmap& device, const SkPai : INHERITED(device, paint) { SkASSERT(paint.getShader() == nullptr); SkASSERT(paint.getColorFilter() == nullptr); - SkASSERT(paint.getXfermode() == nullptr); + SkASSERT(paint.isSrcOver()); SkASSERT(paint.getColor() == SK_ColorBLACK); } @@ -683,7 +683,7 @@ SkRGB16_Shader_Blitter::SkRGB16_Shader_Blitter(const SkPixmap& device, SkShader::Context* shaderContext) : INHERITED(device, paint, shaderContext) { - SkASSERT(paint.getXfermode() == nullptr); + SkASSERT(paint.isSrcOver()); fBuffer = (SkPMColor*)sk_malloc_throw(device.width() * sizeof(SkPMColor)); @@ -809,9 +809,8 @@ SkRGB16_Shader_Xfermode_Blitter::SkRGB16_Shader_Xfermode_Blitter( SkShader::Context* shaderContext) : INHERITED(device, paint, shaderContext) { - fXfermode = paint.getXfermode(); + fXfermode = SkXfermode::Peek(paint.getBlendMode()); SkASSERT(fXfermode); - fXfermode->ref(); int width = device.width(); fBuffer = (SkPMColor*)sk_malloc_throw((width + (SkAlign4(width) >> 2)) * sizeof(SkPMColor)); @@ -819,7 +818,6 @@ SkRGB16_Shader_Xfermode_Blitter::SkRGB16_Shader_Xfermode_Blitter( } SkRGB16_Shader_Xfermode_Blitter::~SkRGB16_Shader_Xfermode_Blitter() { - fXfermode->unref(); sk_free(fBuffer); } @@ -897,14 +895,14 @@ SkBlitter* SkBlitter_ChooseD565(const SkPixmap& device, const SkPaint& paint, SkBlitter* blitter; SkShader* shader = paint.getShader(); - SkXfermode* mode = paint.getXfermode(); + bool is_srcover = paint.isSrcOver(); // we require a shader if there is an xfermode, handled by our caller - SkASSERT(nullptr == mode || shader); + SkASSERT(is_srcover || shader); if (shader) { SkASSERT(shaderContext != nullptr); - if (mode) { + if (!is_srcover) { blitter = allocator->createT(device, paint, shaderContext); } else { diff --git a/src/core/SkBlitter_Sprite.cpp b/src/core/SkBlitter_Sprite.cpp index 950f18791f..cef4cfaa2f 100644 --- a/src/core/SkBlitter_Sprite.cpp +++ b/src/core/SkBlitter_Sprite.cpp @@ -68,14 +68,11 @@ public: if (0xFF != paint.getAlpha()) { return false; } - SkXfermode::Mode mode; - if (!SkXfermode::AsMode(paint.getXfermode(), &mode)) { - return false; - } - if (SkXfermode::kSrc_Mode == mode) { + SkBlendMode mode = paint.getBlendMode(); + if (SkBlendMode::kSrc == mode) { return true; } - if (SkXfermode::kSrcOver_Mode == mode && src.isOpaque()) { + if (SkBlendMode::kSrcOver == mode && src.isOpaque()) { return true; } @@ -85,7 +82,7 @@ public: return false; } - return SkXfermode::kSrcOver_Mode == mode; + return SkBlendMode::kSrcOver == mode; } SkSpriteBlitter_Src_SrcOver(const SkPixmap& src) @@ -94,14 +91,11 @@ public: void setup(const SkPixmap& dst, int left, int top, const SkPaint& paint) override { SkASSERT(Supports(dst, fSource, paint)); this->INHERITED::setup(dst, left, top, paint); - SkXfermode::Mode mode; - if (!SkXfermode::AsMode(paint.getXfermode(), &mode)) { - SkFAIL("Should never happen."); - } + SkBlendMode mode = paint.getBlendMode(); - SkASSERT(mode == SkXfermode::kSrcOver_Mode || mode == SkXfermode::kSrc_Mode); + SkASSERT(mode == SkBlendMode::kSrcOver || mode == SkBlendMode::kSrc); - if (mode == SkXfermode::kSrcOver_Mode && !fSource.isOpaque()) { + if (mode == SkBlendMode::kSrcOver && !fSource.isOpaque()) { fUseMemcpy = false; } } diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp index 7db8601846..cf3b5309c4 100644 --- a/src/core/SkCanvas.cpp +++ b/src/core/SkCanvas.cpp @@ -484,7 +484,7 @@ public: */ SkPaint tmp; tmp.setImageFilter(fPaint->getImageFilter()); - tmp.setXfermode(sk_ref_sp(fPaint->getXfermode())); + tmp.setBlendMode(fPaint->getBlendMode()); SkRect storage; if (rawBounds) { // Make rawBounds include all paint outsets except for those due to image filters. @@ -558,7 +558,7 @@ bool AutoDrawLooper::doNext(SkDrawFilter::Type drawType) { if (fTempLayerForImageFilter) { paint->setImageFilter(nullptr); - paint->setXfermode(nullptr); + paint->setBlendMode(SkBlendMode::kSrcOver); } if (fLooperContext && !fLooperContext->next(fCanvas, paint)) { @@ -2634,7 +2634,7 @@ void SkCanvas::DrawTextDecorations(const SkDraw& draw, const SkPaint& paint, // nothing to draw if (text == nullptr || byteLength == 0 || draw.fRC->isEmpty() || - (paint.getAlpha() == 0 && paint.getXfermode() == nullptr)) { + (paint.getAlpha() == 0 && paint.isSrcOver())) { return; } @@ -2938,26 +2938,21 @@ void SkCanvas::onDrawAnnotation(const SkRect& rect, const char key[], SkData* va // methods, rather than actually drawing themselves. ////////////////////////////////////////////////////////////////////////////// -void SkCanvas::drawARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b, - SkXfermode::Mode mode) { +void SkCanvas::drawARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b, SkBlendMode mode) { TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawARGB()"); SkPaint paint; paint.setARGB(a, r, g, b); - if (SkXfermode::kSrcOver_Mode != mode) { - paint.setXfermodeMode(mode); - } + paint.setBlendMode(mode); this->drawPaint(paint); } -void SkCanvas::drawColor(SkColor c, SkXfermode::Mode mode) { +void SkCanvas::drawColor(SkColor c, SkBlendMode mode) { TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawColor()"); SkPaint paint; paint.setColor(c); - if (SkXfermode::kSrcOver_Mode != mode) { - paint.setXfermodeMode(mode); - } + paint.setBlendMode(mode); this->drawPaint(paint); } diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp index 53c8e5f0e8..2a88781e48 100644 --- a/src/core/SkDraw.cpp +++ b/src/core/SkDraw.cpp @@ -7,6 +7,7 @@ #define __STDC_LIMIT_MACROS #include "SkDraw.h" +#include "SkBlendModePriv.h" #include "SkBlitter.h" #include "SkCanvas.h" #include "SkColorPriv.h" @@ -163,31 +164,27 @@ static BitmapXferProc ChooseBitmapXferProc(const SkPixmap& dst, const SkPaint& p return nullptr; } - SkXfermode::Mode mode; - if (!SkXfermode::AsMode(paint.getXfermode(), &mode)) { - return nullptr; - } - + SkBlendMode mode = paint.getBlendMode(); SkColor color = paint.getColor(); // collaps modes based on color... - if (SkXfermode::kSrcOver_Mode == mode) { + if (SkBlendMode::kSrcOver == mode) { unsigned alpha = SkColorGetA(color); if (0 == alpha) { - mode = SkXfermode::kDst_Mode; + mode = SkBlendMode::kDst; } else if (0xFF == alpha) { - mode = SkXfermode::kSrc_Mode; + mode = SkBlendMode::kSrc; } } switch (mode) { - case SkXfermode::kClear_Mode: + case SkBlendMode::kClear: // SkDebugf("--- D_Clear_BitmapXferProc\n"); return D_Clear_BitmapXferProc; // ignore data - case SkXfermode::kDst_Mode: + case SkBlendMode::kDst: // SkDebugf("--- D_Dst_BitmapXferProc\n"); return D_Dst_BitmapXferProc; // ignore data - case SkXfermode::kSrc_Mode: { + case SkBlendMode::kSrc: { /* should I worry about dithering for the lower depths? */ @@ -1143,7 +1140,7 @@ void SkDraw::drawPath(const SkPath& origSrcPath, const SkPaint& origPaint, if (SkDrawTreatAsHairline(origPaint, *matrix, &coverage)) { if (SK_Scalar1 == coverage) { paint.writable()->setStrokeWidth(0); - } else if (SkXfermode::SupportsCoverageAsAlpha(origPaint.getXfermode())) { + } else if (SkBlendMode_SupportsCoverageAsAlpha(origPaint.getBlendMode())) { U8CPU newAlpha; #if 0 newAlpha = SkToU8(SkScalarRoundToInt(coverage * diff --git a/src/core/SkGpuBlurUtils.cpp b/src/core/SkGpuBlurUtils.cpp index 5b29884c25..ec3b0a9909 100644 --- a/src/core/SkGpuBlurUtils.cpp +++ b/src/core/SkGpuBlurUtils.cpp @@ -80,7 +80,7 @@ static void convolve_gaussian_1d(GrDrawContext* drawContext, sk_sp conv(GrConvolutionEffect::MakeGaussian( texture, direction, radius, sigma, useBounds, bounds)); paint.addColorFragmentProcessor(std::move(conv)); - paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); + paint.setPorterDuffXPFactory(SkBlendMode::kSrc); SkMatrix localMatrix = SkMatrix::MakeTrans(-SkIntToScalar(srcOffset.x()), -SkIntToScalar(srcOffset.y())); drawContext->fillRectWithLocalMatrix(clip, paint, SkMatrix::I(), @@ -110,7 +110,7 @@ static void convolve_gaussian_2d(GrDrawContext* drawContext, srcBounds ? GrTextureDomain::kDecal_Mode : GrTextureDomain::kIgnore_Mode, true, sigmaX, sigmaY)); paint.addColorFragmentProcessor(std::move(conv)); - paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); + paint.setPorterDuffXPFactory(SkBlendMode::kSrc); drawContext->fillRectWithLocalMatrix(clip, paint, SkMatrix::I(), SkRect::Make(dstRect), localMatrix); } @@ -285,7 +285,7 @@ sk_sp GaussianBlur(GrContext* context, GrTextureParams params(SkShader::kClamp_TileMode, GrTextureParams::kBilerp_FilterMode); paint.addColorTextureProcessor(srcTexture.get(), nullptr, matrix, params); } - paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); + paint.setPorterDuffXPFactory(SkBlendMode::kSrc); shrink_irect_by_2(&dstRect, i < scaleFactorX, i < scaleFactorY); dstDrawContext->fillRectToRect(clip, paint, SkMatrix::I(), @@ -361,7 +361,7 @@ sk_sp GaussianBlur(GrContext* context, GrTextureParams params(SkShader::kClamp_TileMode, GrTextureParams::kBilerp_FilterMode); sk_sp tex(srcDrawContext->asTexture()); paint.addColorTextureProcessor(tex.get(), nullptr, matrix, params); - paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); + paint.setPorterDuffXPFactory(SkBlendMode::kSrc); SkIRect dstRect(srcRect); scale_irect(&dstRect, scaleFactorX, scaleFactorY); diff --git a/src/core/SkImageFilter.cpp b/src/core/SkImageFilter.cpp index 63095bc65d..68183cc444 100644 --- a/src/core/SkImageFilter.cpp +++ b/src/core/SkImageFilter.cpp @@ -281,7 +281,7 @@ sk_sp SkImageFilter::DrawWithFP(GrContext* context, const OutputProperties& outputProperties) { GrPaint paint; paint.addColorFragmentProcessor(std::move(fp)); - paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); + paint.setPorterDuffXPFactory(SkBlendMode::kSrc); sk_sp colorSpace = sk_ref_sp(outputProperties.colorSpace()); GrPixelConfig config = GrRenderableConfigForColorSpace(colorSpace.get()); diff --git a/src/core/SkMatrixImageFilter.cpp b/src/core/SkMatrixImageFilter.cpp index 12efc64683..0a33280414 100644 --- a/src/core/SkMatrixImageFilter.cpp +++ b/src/core/SkMatrixImageFilter.cpp @@ -85,7 +85,7 @@ sk_sp SkMatrixImageFilter::onFilterImage(SkSpecialImage* source, SkPaint paint; paint.setAntiAlias(true); - paint.setXfermodeMode(SkXfermode::kSrc_Mode); + paint.setBlendMode(SkBlendMode::kSrc); paint.setFilterQuality(fFilterQuality); input->draw(canvas, srcRect.x(), srcRect.y(), &paint); diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp index 9d76a169b3..1c5065e8c9 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 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((tmp >> 24) & 0xFF)); this->setStrokeJoin(static_cast((tmp >> 16) & 0xFF)); - this->setStyle(static_cast