aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/effects/SkXfermodeImageFilter.cpp
diff options
context:
space:
mode:
authorGravatar Mike Reed <reed@google.com>2016-10-03 12:57:32 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2016-10-03 17:17:10 +0000
commit0591897548c8fcb7d53cc94053e01702e58f1ac5 (patch)
tree099bf31c7bf4bd3062d2e7a8b4268a89f1fd61a2 /src/effects/SkXfermodeImageFilter.cpp
parenta224bb7027f022cf78376cb7afa2fff83d59153e (diff)
replace SkXfermode obj with SkBlendMode enum in paints
BUG=skia:5814 GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2714 Change-Id: I4fb489ba6b3f77b458f7e4a99f79c7ad10859135 Reviewed-on: https://skia-review.googlesource.com/2714 Reviewed-by: Florin Malita <fmalita@chromium.org> Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Mike Reed <reed@google.com>
Diffstat (limited to 'src/effects/SkXfermodeImageFilter.cpp')
-rw-r--r--src/effects/SkXfermodeImageFilter.cpp73
1 files changed, 43 insertions, 30 deletions
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<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 +55,7 @@ protected:
#endif
private:
- sk_sp<SkXfermode> fMode;
+ SkBlendMode fMode;
friend class SkXfermodeImageFilter;
@@ -64,7 +64,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 +72,36 @@ 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)
- : INHERITED(inputs, 2, cropRect)
- , fMode(std::move(mode)) {
+#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(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),
+ 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<SkSpecialImage> SkXfermodeImageFilter_Base::onFilterImage(SkSpecialImage* source,
@@ -147,7 +160,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 +174,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 +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<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 +299,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 +309,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 +324,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 +360,8 @@ 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(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<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);
}