diff options
author | reed <reed@google.com> | 2016-10-05 17:33:02 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-10-05 17:33:03 -0700 |
commit | 374772bd61951f01bf84fe17bf53d8867681c9ae (patch) | |
tree | ade94be090be12f7503fd35e77c4dae2dc1f0a47 /src/effects | |
parent | 61c21cdcc31081a1bd4a3a7480b482d135f7df33 (diff) |
Revert[8] "replace SkXfermode obj with SkBlendMode enum in paints"
This reverts commit c245574ba3d0e2ade6c94b2812de3baa383bf4c4.
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2396953002
TBR=
Review-Url: https://codereview.chromium.org/2396953002
Diffstat (limited to 'src/effects')
-rw-r--r-- | src/effects/SkAlphaThresholdFilter.cpp | 2 | ||||
-rw-r--r-- | src/effects/SkArithmeticMode.cpp | 8 | ||||
-rw-r--r-- | src/effects/SkArithmeticModePriv.h | 5 | ||||
-rw-r--r-- | src/effects/SkColorFilterImageFilter.cpp | 2 | ||||
-rw-r--r-- | src/effects/SkDisplacementMapEffect.cpp | 2 | ||||
-rw-r--r-- | src/effects/SkDropShadowImageFilter.cpp | 1 | ||||
-rw-r--r-- | src/effects/SkImageSource.cpp | 2 | ||||
-rw-r--r-- | src/effects/SkLayerDrawLooper.cpp | 2 | ||||
-rw-r--r-- | src/effects/SkLightingImageFilter.cpp | 2 | ||||
-rwxr-xr-x | src/effects/SkMergeImageFilter.cpp | 2 | ||||
-rw-r--r-- | src/effects/SkMorphologyImageFilter.cpp | 4 | ||||
-rw-r--r-- | src/effects/SkOffsetImageFilter.cpp | 2 | ||||
-rw-r--r-- | src/effects/SkTileImageFilter.cpp | 4 | ||||
-rw-r--r-- | src/effects/SkXfermodeImageFilter.cpp | 100 |
14 files changed, 95 insertions, 43 deletions
diff --git a/src/effects/SkAlphaThresholdFilter.cpp b/src/effects/SkAlphaThresholdFilter.cpp index 515e05b323..bbae2e1552 100644 --- a/src/effects/SkAlphaThresholdFilter.cpp +++ b/src/effects/SkAlphaThresholdFilter.cpp @@ -107,7 +107,7 @@ sk_sp<GrTexture> SkAlphaThresholdFilterImpl::createMaskTexture(GrContext* contex } GrPaint grPaint; - grPaint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); + grPaint.setPorterDuffXPFactory(SkBlendMode::kSrc); SkRegion::Iterator iter(fRegion); drawContext->clear(nullptr, 0x0, true); diff --git a/src/effects/SkArithmeticMode.cpp b/src/effects/SkArithmeticMode.cpp index 81f29bb9d8..62595cf1ee 100644 --- a/src/effects/SkArithmeticMode.cpp +++ b/src/effects/SkArithmeticMode.cpp @@ -39,6 +39,14 @@ public: sk_sp<GrXPFactory> asXPFactory() const override; #endif + bool isArithmetic(SkArithmeticParams* params) const override { + if (params) { + memcpy(params->fK, fK, 4 * sizeof(float)); + params->fEnforcePMColor = fEnforcePMColor; + } + return true; + } + private: void flatten(SkWriteBuffer& buffer) const override { buffer.writeScalar(fK[0]); diff --git a/src/effects/SkArithmeticModePriv.h b/src/effects/SkArithmeticModePriv.h index 04bd90eebe..e619274d25 100644 --- a/src/effects/SkArithmeticModePriv.h +++ b/src/effects/SkArithmeticModePriv.h @@ -10,6 +10,11 @@ #include "SkArithmeticMode.h" +struct SkArithmeticParams { + float fK[4]; + bool fEnforcePMColor; +}; + #ifndef SK_SUPPORT_LEGACY_ARITHMETICMODE class SK_API SkArithmeticMode { diff --git a/src/effects/SkColorFilterImageFilter.cpp b/src/effects/SkColorFilterImageFilter.cpp index d6b23d5038..507a80580f 100644 --- a/src/effects/SkColorFilterImageFilter.cpp +++ b/src/effects/SkColorFilterImageFilter.cpp @@ -89,7 +89,7 @@ sk_sp<SkSpecialImage> SkColorFilterImageFilter::onFilterImage(SkSpecialImage* so SkPaint paint; - paint.setXfermodeMode(SkXfermode::kSrc_Mode); + paint.setBlendMode(SkBlendMode::kSrc); paint.setColorFilter(fColorFilter); // TODO: it may not be necessary to clear or drawPaint inside the input bounds diff --git a/src/effects/SkDisplacementMapEffect.cpp b/src/effects/SkDisplacementMapEffect.cpp index 283372f9a9..88f5026663 100644 --- a/src/effects/SkDisplacementMapEffect.cpp +++ b/src/effects/SkDisplacementMapEffect.cpp @@ -343,7 +343,7 @@ sk_sp<SkSpecialImage> SkDisplacementMapEffect::onFilterImage(SkSpecialImage* sou offsetMatrix, colorTexture.get(), SkISize::Make(color->width(), color->height()))); - paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); + paint.setPorterDuffXPFactory(SkBlendMode::kSrc); SkMatrix matrix; matrix.setTranslate(-SkIntToScalar(colorBounds.x()), -SkIntToScalar(colorBounds.y())); diff --git a/src/effects/SkDropShadowImageFilter.cpp b/src/effects/SkDropShadowImageFilter.cpp index b4b8cac4f0..cc43db7f08 100644 --- a/src/effects/SkDropShadowImageFilter.cpp +++ b/src/effects/SkDropShadowImageFilter.cpp @@ -95,7 +95,6 @@ sk_sp<SkSpecialImage> SkDropShadowImageFilter::onFilterImage(SkSpecialImage* sou SkPaint paint; paint.setImageFilter(SkBlurImageFilter::Make(sigma.fX, sigma.fY, nullptr)); paint.setColorFilter(SkColorFilter::MakeModeFilter(fColor, SkXfermode::kSrcIn_Mode)); - paint.setXfermodeMode(SkXfermode::kSrcOver_Mode); SkVector offsetVec = SkVector::Make(fDx, fDy); ctx.ctm().mapVectors(&offsetVec, 1); diff --git a/src/effects/SkImageSource.cpp b/src/effects/SkImageSource.cpp index f434de4aa0..f96a4a1676 100644 --- a/src/effects/SkImageSource.cpp +++ b/src/effects/SkImageSource.cpp @@ -108,7 +108,7 @@ sk_sp<SkSpecialImage> SkImageSource::onFilterImage(SkSpecialImage* source, const // Subtract off the integer component of the translation (will be applied in offset, below). dstRect.offset(-SkIntToScalar(dstIRect.fLeft), -SkIntToScalar(dstIRect.fTop)); - paint.setXfermodeMode(SkXfermode::kSrc_Mode); + paint.setBlendMode(SkBlendMode::kSrc); // FIXME: this probably shouldn't be necessary, but drawImageRect asserts // None filtering when it's translate-only paint.setFilterQuality( diff --git a/src/effects/SkLayerDrawLooper.cpp b/src/effects/SkLayerDrawLooper.cpp index d8f774437e..784228fa8b 100644 --- a/src/effects/SkLayerDrawLooper.cpp +++ b/src/effects/SkLayerDrawLooper.cpp @@ -104,7 +104,7 @@ void SkLayerDrawLooper::LayerDrawLooperContext::ApplyInfo( dst->setColorFilter(sk_ref_sp(src.getColorFilter())); } if (bits & kXfermode_Bit) { - dst->setXfermode(sk_ref_sp(src.getXfermode())); + dst->setBlendMode(src.getBlendMode()); } // we don't override these diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp index 56275743d7..057ef24e95 100644 --- a/src/effects/SkLightingImageFilter.cpp +++ b/src/effects/SkLightingImageFilter.cpp @@ -396,7 +396,7 @@ void SkLightingImageFilterInternal::drawRect(GrDrawContext* drawContext, sk_sp<GrFragmentProcessor> fp(this->makeFragmentProcessor(src, matrix, srcBounds, boundaryMode)); paint.addColorFragmentProcessor(std::move(fp)); - paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); + paint.setPorterDuffXPFactory(SkBlendMode::kSrc); drawContext->fillRectToRect(clip, paint, SkMatrix::I(), dstRect, srcRect); } diff --git a/src/effects/SkMergeImageFilter.cpp b/src/effects/SkMergeImageFilter.cpp index cc7e336a3d..9830669f04 100755 --- a/src/effects/SkMergeImageFilter.cpp +++ b/src/effects/SkMergeImageFilter.cpp @@ -131,7 +131,7 @@ sk_sp<SkSpecialImage> SkMergeImageFilter::onFilterImage(SkSpecialImage* source, SkPaint paint; if (fModes) { - paint.setXfermodeMode((SkXfermode::Mode)fModes[i]); + paint.setBlendMode((SkBlendMode)fModes[i]); } inputs[i]->draw(canvas, diff --git a/src/effects/SkMorphologyImageFilter.cpp b/src/effects/SkMorphologyImageFilter.cpp index 82e47c5081..2bd792860b 100644 --- a/src/effects/SkMorphologyImageFilter.cpp +++ b/src/effects/SkMorphologyImageFilter.cpp @@ -401,7 +401,7 @@ static void apply_morphology_rect(GrDrawContext* drawContext, radius, morphType, bounds)); - paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); + paint.setPorterDuffXPFactory(SkBlendMode::kSrc); drawContext->fillRectToRect(clip, paint, SkMatrix::I(), SkRect::Make(dstRect), SkRect::Make(srcRect)); } @@ -418,7 +418,7 @@ static void apply_morphology_rect_no_bounds(GrDrawContext* drawContext, paint.setGammaCorrect(drawContext->isGammaCorrect()); paint.addColorFragmentProcessor(GrMorphologyEffect::Make(texture, direction, radius, morphType)); - paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); + paint.setPorterDuffXPFactory(SkBlendMode::kSrc); drawContext->fillRectToRect(clip, paint, SkMatrix::I(), SkRect::Make(dstRect), SkRect::Make(srcRect)); } diff --git a/src/effects/SkOffsetImageFilter.cpp b/src/effects/SkOffsetImageFilter.cpp index 1c99154f16..2e8b0d916d 100644 --- a/src/effects/SkOffsetImageFilter.cpp +++ b/src/effects/SkOffsetImageFilter.cpp @@ -61,7 +61,7 @@ sk_sp<SkSpecialImage> SkOffsetImageFilter::onFilterImage(SkSpecialImage* source, canvas->clear(0x0); SkPaint paint; - paint.setXfermodeMode(SkXfermode::kSrc_Mode); + paint.setBlendMode(SkBlendMode::kSrc); canvas->translate(SkIntToScalar(srcOffset.fX - bounds.fLeft), SkIntToScalar(srcOffset.fY - bounds.fTop)); diff --git a/src/effects/SkTileImageFilter.cpp b/src/effects/SkTileImageFilter.cpp index 46c4d9af67..a140db216b 100644 --- a/src/effects/SkTileImageFilter.cpp +++ b/src/effects/SkTileImageFilter.cpp @@ -87,7 +87,7 @@ sk_sp<SkSpecialImage> SkTileImageFilter::onFilterImage(SkSpecialImage* source, SkASSERT(canvas); SkPaint paint; - paint.setXfermodeMode(SkXfermode::kSrc_Mode); + paint.setBlendMode(SkBlendMode::kSrc); input->draw(canvas, SkIntToScalar(inputOffset.x()), SkIntToScalar(inputOffset.y()), @@ -107,7 +107,7 @@ sk_sp<SkSpecialImage> SkTileImageFilter::onFilterImage(SkSpecialImage* source, SkASSERT(canvas); SkPaint paint; - paint.setXfermodeMode(SkXfermode::kSrc_Mode); + paint.setBlendMode(SkBlendMode::kSrc); paint.setShader(subset->makeShader(SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode)); canvas->translate(-dstRect.fLeft, -dstRect.fTop); canvas->drawRect(dstRect, paint); diff --git a/src/effects/SkXfermodeImageFilter.cpp b/src/effects/SkXfermodeImageFilter.cpp index 952ce977aa..b0735168b5 100644 --- a/src/effects/SkXfermodeImageFilter.cpp +++ b/src/effects/SkXfermodeImageFilter.cpp @@ -6,6 +6,7 @@ */ #include "SkXfermodeImageFilter.h" +#include "SkArithmeticModePriv.h" #include "SkCanvas.h" #include "SkColorPriv.h" @@ -27,7 +28,7 @@ class SkXfermodeImageFilter_Base : public SkImageFilter { public: - SkXfermodeImageFilter_Base(sk_sp<SkXfermode> mode, sk_sp<SkImageFilter> inputs[2], + SkXfermodeImageFilter_Base(SkBlendMode mode, sk_sp<SkImageFilter> inputs[2], const CropRect* cropRect); SK_TO_STRING_OVERRIDE() @@ -55,7 +56,7 @@ protected: #endif private: - sk_sp<SkXfermode> fMode; + SkBlendMode fMode; friend class SkXfermodeImageFilter; @@ -64,7 +65,7 @@ private: /////////////////////////////////////////////////////////////////////////////// -sk_sp<SkImageFilter> SkXfermodeImageFilter::Make(sk_sp<SkXfermode> mode, +sk_sp<SkImageFilter> SkXfermodeImageFilter::Make(SkBlendMode mode, sk_sp<SkImageFilter> background, sk_sp<SkImageFilter> foreground, const SkImageFilter::CropRect* cropRect) { @@ -72,23 +73,59 @@ sk_sp<SkImageFilter> SkXfermodeImageFilter::Make(sk_sp<SkXfermode> mode, return sk_sp<SkImageFilter>(new SkXfermodeImageFilter_Base(mode, inputs, cropRect)); } -SkXfermodeImageFilter_Base::SkXfermodeImageFilter_Base(sk_sp<SkXfermode> mode, - sk_sp<SkImageFilter> inputs[2], - const CropRect* cropRect) +#ifdef SK_SUPPORT_LEGACY_XFERMODE_OBJECT +sk_sp<SkImageFilter> SkXfermodeImageFilter::Make(sk_sp<SkXfermode> mode, + sk_sp<SkImageFilter> background, + sk_sp<SkImageFilter> 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<SkImageFilter> inputs[2], + const CropRect* cropRect) : INHERITED(inputs, 2, cropRect) - , fMode(std::move(mode)) { + , fMode(mode) +{} + +static int unflatten_blendmode(SkReadBuffer& buffer, SkArithmeticParams* arith) { + if (buffer.isVersionLT(SkReadBuffer::kXfermodeToBlendMode_Version)) { + sk_sp<SkXfermode> xfer = buffer.readXfermode(); + if (xfer) { + if (xfer->isArithmetic(arith)) { + return -1; + } + return (int)xfer->blend(); + } else { + return (int)SkBlendMode::kSrcOver; + } + } else { + uint32_t mode = buffer.read32(); + (void)buffer.validate(mode <= (unsigned)SkBlendMode::kLastMode); + return mode; + } } sk_sp<SkFlattenable> SkXfermodeImageFilter_Base::CreateProc(SkReadBuffer& buffer) { SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 2); - sk_sp<SkXfermode> mode(buffer.readXfermode()); - return SkXfermodeImageFilter::Make(std::move(mode), common.getInput(0), common.getInput(1), - &common.cropRect()); + SkArithmeticParams arith; + int mode = unflatten_blendmode(buffer, &arith); + if (mode >= 0) { + return SkXfermodeImageFilter::Make((SkBlendMode)mode, common.getInput(0), + common.getInput(1), &common.cropRect()); + } else { + return SkXfermodeImageFilter::MakeArithmetic(arith.fK[0], arith.fK[1], arith.fK[2], + arith.fK[3], arith.fEnforcePMColor, + 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<SkSpecialImage> SkXfermodeImageFilter_Base::onFilterImage(SkSpecialImage* source, @@ -147,7 +184,7 @@ sk_sp<SkSpecialImage> 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 +198,7 @@ sk_sp<SkSpecialImage> 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 +212,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)", (int)fMode); if (this->getInput(0)) { str->appendf("foreground: ("); this->getInput(0)->toString(str); @@ -266,7 +299,7 @@ sk_sp<SkSpecialImage> SkXfermodeImageFilter_Base::filterImageGPU( paint.addColorFragmentProcessor(std::move(bgFP)); } - paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); + paint.setPorterDuffXPFactory(SkBlendMode::kSrc); sk_sp<GrDrawContext> drawContext( context->makeDrawContext(SkBackingFit::kApprox, bounds.width(), bounds.height(), @@ -290,8 +323,9 @@ sk_sp<SkSpecialImage> SkXfermodeImageFilter_Base::filterImageGPU( sk_sp<GrFragmentProcessor> SkXfermodeImageFilter_Base::makeFGFrag(sk_sp<GrFragmentProcessor> bgFP) const { // A null fMode is interpreted to mean kSrcOver_Mode (to match raster). - SkAutoTUnref<SkXfermode> mode(SkSafeRef(fMode.get())); - if (!mode) { + SkXfermode* xfer = SkXfermode::Peek(fMode); + sk_sp<SkXfermode> 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 +333,11 @@ SkXfermodeImageFilter_Base::makeFGFrag(sk_sp<GrFragmentProcessor> 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 +348,8 @@ class SkArithmeticImageFilter : public SkXfermodeImageFilter_Base { public: SkArithmeticImageFilter(float k1, float k2, float k3, float k4, bool enforcePMColor, sk_sp<SkImageFilter> 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 +384,11 @@ sk_sp<SkFlattenable> SkArithmeticImageFilter::CreateProc(SkReadBuffer& buffer) { SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 2); // skip the mode (srcover) our parent-class wrote - sk_sp<SkXfermode> mode(buffer.readXfermode()); - SkASSERT(nullptr == mode); + SkDEBUGCODE(int mode =) unflatten_blendmode(buffer, nullptr); + if (!buffer.isValid()) { + return nullptr; + } + SkASSERT(SkBlendMode::kSrcOver == (SkBlendMode)mode); float k[4]; for (int i = 0; i < 4; ++i) { @@ -475,16 +515,16 @@ sk_sp<SkImageFilter> 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); } |