From 70cdb396eb5ffbbed128b902532e9292b5ec0e9d Mon Sep 17 00:00:00 2001 From: Mike Reed Date: Mon, 3 Oct 2016 15:44:23 -0400 Subject: Revert "Revert "replace SkXfermode obj with SkBlendMode enum in paints"" This reverts commit ce02e7175872abde3721df9e5d3ec0ab8384cd8e. BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2878 Change-Id: I86875511a13497112827cbaed1dbd7639e9e3d10 Reviewed-on: https://skia-review.googlesource.com/2878 Reviewed-by: Matt Sarett Commit-Queue: Mike Reed --- src/effects/SkXfermodeImageFilter.cpp | 73 +++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 30 deletions(-) (limited to 'src/effects/SkXfermodeImageFilter.cpp') diff --git a/src/effects/SkXfermodeImageFilter.cpp b/src/effects/SkXfermodeImageFilter.cpp index 952ce977aa..2335a760fb 100644 --- a/src/effects/SkXfermodeImageFilter.cpp +++ b/src/effects/SkXfermodeImageFilter.cpp @@ -27,7 +27,7 @@ class SkXfermodeImageFilter_Base : public SkImageFilter { public: - SkXfermodeImageFilter_Base(sk_sp mode, sk_sp inputs[2], + SkXfermodeImageFilter_Base(SkBlendMode mode, sk_sp inputs[2], const CropRect* cropRect); SK_TO_STRING_OVERRIDE() @@ -55,7 +55,7 @@ protected: #endif private: - sk_sp fMode; + SkBlendMode fMode; friend class SkXfermodeImageFilter; @@ -64,7 +64,7 @@ private: /////////////////////////////////////////////////////////////////////////////// -sk_sp SkXfermodeImageFilter::Make(sk_sp mode, +sk_sp SkXfermodeImageFilter::Make(SkBlendMode mode, sk_sp background, sk_sp foreground, const SkImageFilter::CropRect* cropRect) { @@ -72,23 +72,36 @@ sk_sp SkXfermodeImageFilter::Make(sk_sp mode, return sk_sp(new SkXfermodeImageFilter_Base(mode, inputs, cropRect)); } -SkXfermodeImageFilter_Base::SkXfermodeImageFilter_Base(sk_sp mode, - sk_sp inputs[2], - const CropRect* cropRect) - : INHERITED(inputs, 2, cropRect) - , fMode(std::move(mode)) { +#ifdef SK_SUPPORT_LEGACY_XFERMODE_OBJECT +sk_sp SkXfermodeImageFilter::Make(sk_sp mode, + sk_sp background, + sk_sp foreground, + const SkImageFilter::CropRect* cropRect) { + return Make(mode ? mode->blend() : SkBlendMode::kSrcOver, + std::move(background), std::move(foreground), cropRect); } +#endif + +SkXfermodeImageFilter_Base::SkXfermodeImageFilter_Base(SkBlendMode mode, + sk_sp inputs[2], + const CropRect* cropRect) + : INHERITED(inputs, 2, cropRect) + , fMode(mode) +{} sk_sp SkXfermodeImageFilter_Base::CreateProc(SkReadBuffer& buffer) { SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 2); - sk_sp mode(buffer.readXfermode()); - return SkXfermodeImageFilter::Make(std::move(mode), common.getInput(0), common.getInput(1), + uint32_t mode = buffer.read32(); + if (!buffer.validate(mode <= (unsigned)SkBlendMode::kLastMode)) { + return nullptr; + } + return SkXfermodeImageFilter::Make((SkBlendMode)mode, common.getInput(0), common.getInput(1), &common.cropRect()); } void SkXfermodeImageFilter_Base::flatten(SkWriteBuffer& buffer) const { this->INHERITED::flatten(buffer); - buffer.writeFlattenable(fMode.get()); + buffer.write32((unsigned)fMode); } sk_sp SkXfermodeImageFilter_Base::onFilterImage(SkSpecialImage* source, @@ -147,7 +160,7 @@ sk_sp SkXfermodeImageFilter_Base::onFilterImage(SkSpecialImage* if (background) { SkPaint paint; - paint.setXfermodeMode(SkXfermode::kSrc_Mode); + paint.setBlendMode(SkBlendMode::kSrc); background->draw(canvas, SkIntToScalar(backgroundOffset.fX), SkIntToScalar(backgroundOffset.fY), &paint); @@ -161,7 +174,7 @@ sk_sp SkXfermodeImageFilter_Base::onFilterImage(SkSpecialImage* void SkXfermodeImageFilter_Base::drawForeground(SkCanvas* canvas, SkSpecialImage* img, const SkIRect& fgBounds) const { SkPaint paint; - paint.setXfermode(fMode); + paint.setBlendMode(fMode); if (img) { img->draw(canvas, SkIntToScalar(fgBounds.fLeft), SkIntToScalar(fgBounds.fTop), &paint); } @@ -175,11 +188,7 @@ void SkXfermodeImageFilter_Base::drawForeground(SkCanvas* canvas, SkSpecialImage #ifndef SK_IGNORE_TO_STRING void SkXfermodeImageFilter_Base::toString(SkString* str) const { str->appendf("SkXfermodeImageFilter: ("); - str->appendf("xfermode: ("); - if (fMode) { - fMode->toString(str); - } - str->append(")"); + str->appendf("blendmode: (%d)", fMode); if (this->getInput(0)) { str->appendf("foreground: ("); this->getInput(0)->toString(str); @@ -266,7 +275,7 @@ sk_sp SkXfermodeImageFilter_Base::filterImageGPU( paint.addColorFragmentProcessor(std::move(bgFP)); } - paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); + paint.setPorterDuffXPFactory(SkBlendMode::kSrc); sk_sp drawContext( context->makeDrawContext(SkBackingFit::kApprox, bounds.width(), bounds.height(), @@ -290,8 +299,9 @@ sk_sp SkXfermodeImageFilter_Base::filterImageGPU( sk_sp SkXfermodeImageFilter_Base::makeFGFrag(sk_sp bgFP) const { // A null fMode is interpreted to mean kSrcOver_Mode (to match raster). - SkAutoTUnref mode(SkSafeRef(fMode.get())); - if (!mode) { + SkXfermode* xfer = SkXfermode::Peek(fMode); + sk_sp srcover; + if (!xfer) { // It would be awesome to use SkXfermode::Create here but it knows better // than us and won't return a kSrcOver_Mode SkXfermode. That means we // have to get one the hard way. @@ -299,9 +309,11 @@ SkXfermodeImageFilter_Base::makeFGFrag(sk_sp bgFP) const { rec.fProc = SkXfermode::GetProc(SkXfermode::kSrcOver_Mode); SkXfermode::ModeAsCoeff(SkXfermode::kSrcOver_Mode, &rec.fSC, &rec.fDC); - mode.reset(new SkProcCoeffXfermode(rec, SkXfermode::kSrcOver_Mode)); + srcover.reset(new SkProcCoeffXfermode(rec, SkXfermode::kSrcOver_Mode)); + xfer = srcover.get(); + } - return mode->makeFragmentProcessorForImageFilter(std::move(bgFP)); + return xfer->makeFragmentProcessorForImageFilter(std::move(bgFP)); } #endif @@ -312,7 +324,8 @@ class SkArithmeticImageFilter : public SkXfermodeImageFilter_Base { public: SkArithmeticImageFilter(float k1, float k2, float k3, float k4, bool enforcePMColor, sk_sp inputs[2], const CropRect* cropRect) - : SkXfermodeImageFilter_Base(nullptr, inputs, cropRect) + // need to pass a blendmode to our inherited constructor, but we ignore it + : SkXfermodeImageFilter_Base(SkBlendMode::kSrcOver, inputs, cropRect) , fK{ k1, k2, k3, k4 } , fEnforcePMColor(enforcePMColor) {} @@ -347,8 +360,8 @@ sk_sp SkArithmeticImageFilter::CreateProc(SkReadBuffer& buffer) { SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 2); // skip the mode (srcover) our parent-class wrote - sk_sp mode(buffer.readXfermode()); - SkASSERT(nullptr == mode); + SkDEBUGCODE(uint32_t mode =) buffer.read32(); + SkASSERT((unsigned)SkBlendMode::kSrcOver == mode); float k[4]; for (int i = 0; i < 4; ++i) { @@ -475,16 +488,16 @@ sk_sp SkXfermodeImageFilter::MakeArithmetic(float k1, float k2, f int mode = -1; // illegal mode if (SkScalarNearlyZero(k1) && SkScalarNearlyEqual(k2, SK_Scalar1) && SkScalarNearlyZero(k3) && SkScalarNearlyZero(k4)) { - mode = SkXfermode::kSrc_Mode; + mode = (int)SkBlendMode::kSrc; } else if (SkScalarNearlyZero(k1) && SkScalarNearlyZero(k2) && SkScalarNearlyEqual(k3, SK_Scalar1) && SkScalarNearlyZero(k4)) { - mode = SkXfermode::kDst_Mode; + mode = (int)SkBlendMode::kDst; } else if (SkScalarNearlyZero(k1) && SkScalarNearlyZero(k2) && SkScalarNearlyZero(k3) && SkScalarNearlyZero(k4)) { - mode = SkXfermode::kClear_Mode; + mode = (int)SkBlendMode::kClear; } if (mode >= 0) { - return SkXfermodeImageFilter::Make(SkXfermode::Make((SkXfermode::Mode)mode), + return SkXfermodeImageFilter::Make((SkBlendMode)mode, std::move(background), std::move(foreground), crop); } -- cgit v1.2.3