aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/effects
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2016-10-05 17:33:02 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-10-05 17:33:03 -0700
commit374772bd61951f01bf84fe17bf53d8867681c9ae (patch)
treeade94be090be12f7503fd35e77c4dae2dc1f0a47 /src/effects
parent61c21cdcc31081a1bd4a3a7480b482d135f7df33 (diff)
Revert[8] "replace SkXfermode obj with SkBlendMode enum in paints"
Diffstat (limited to 'src/effects')
-rw-r--r--src/effects/SkAlphaThresholdFilter.cpp2
-rw-r--r--src/effects/SkArithmeticMode.cpp8
-rw-r--r--src/effects/SkArithmeticModePriv.h5
-rw-r--r--src/effects/SkColorFilterImageFilter.cpp2
-rw-r--r--src/effects/SkDisplacementMapEffect.cpp2
-rw-r--r--src/effects/SkDropShadowImageFilter.cpp1
-rw-r--r--src/effects/SkImageSource.cpp2
-rw-r--r--src/effects/SkLayerDrawLooper.cpp2
-rw-r--r--src/effects/SkLightingImageFilter.cpp2
-rwxr-xr-xsrc/effects/SkMergeImageFilter.cpp2
-rw-r--r--src/effects/SkMorphologyImageFilter.cpp4
-rw-r--r--src/effects/SkOffsetImageFilter.cpp2
-rw-r--r--src/effects/SkTileImageFilter.cpp4
-rw-r--r--src/effects/SkXfermodeImageFilter.cpp100
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);
}