From: Mike Reed Date: Mon, 3 Oct 2016 18:02:50 +0000 (+0000) Subject: Revert "replace SkXfermode obj with SkBlendMode enum in paints" X-Git-Tag: accepted/tizen/5.0/unified/20181102.025319~106^2~80 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ce02e7175872abde3721df9e5d3ec0ab8384cd8e;p=platform%2Fupstream%2FlibSkiaSharp.git Revert "replace SkXfermode obj with SkBlendMode enum in paints" This reverts commit I4fb489ba6b3f77b458f7e4a99f79c7ad10859135. Reason for revert: Original change's description: > 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 > Reviewed-by: Brian Salomon > Commit-Queue: Mike Reed > TBR=bsalomon@google.com,fmalita@chromium.org,fmalita@google.com,reed@google.com,reviews@skia.org NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true Change-Id: I3e43f79ef5c1709929663fe63cc1f67cd78270b7 Reviewed-on: https://skia-review.googlesource.com/2871 Reviewed-by: Mike Reed Commit-Queue: Mike Reed --- diff --git a/bench/RectBench.cpp b/bench/RectBench.cpp index 48764ca..46a515d 100644 --- a/bench/RectBench.cpp +++ b/bench/RectBench.cpp @@ -85,7 +85,7 @@ private: class SrcModeRectBench : public RectBench { public: SrcModeRectBench() : INHERITED(1, 0) { - fMode = SkBlendMode::kSrc; + fMode = SkXfermode::Make(SkXfermode::kSrc_Mode); } protected: @@ -93,7 +93,7 @@ protected: this->INHERITED::setupPaint(paint); // srcmode is most interesting when we're not opaque paint->setAlpha(0x80); - paint->setBlendMode(fMode); + paint->setXfermode(fMode); } const char* onGetName() override { @@ -103,8 +103,8 @@ protected: } private: - SkString fName; - SkBlendMode fMode; + SkString fName; + sk_sp fMode; typedef RectBench INHERITED; }; diff --git a/bench/RotatedRectBench.cpp b/bench/RotatedRectBench.cpp index f81bfb1..23e0443 100644 --- a/bench/RotatedRectBench.cpp +++ b/bench/RotatedRectBench.cpp @@ -67,7 +67,7 @@ static SkString to_lower(const char* str) { class RotRectBench: public Benchmark { public: - RotRectBench(bool aa, ColorType ct, SkBlendMode mode) + RotRectBench(bool aa, ColorType ct, SkXfermode::Mode mode) : fAA(aa) , fColorType(ct) , fMode(mode) { @@ -80,7 +80,7 @@ protected: void onDraw(int loops, SkCanvas* canvas) override { SkPaint paint; paint.setAntiAlias(fAA); - paint.setBlendMode(fMode); + paint.setXfermodeMode(fMode); SkColor color = start_color(fColorType); int w = this->getSize().x(); @@ -147,48 +147,48 @@ private: fName.appendf("_%s", to_lower(SkXfermode::ModeName(fMode)).c_str()); } - bool fAA; - ColorType fColorType; - SkBlendMode fMode; - SkString fName; + bool fAA; + ColorType fColorType; + SkXfermode::Mode fMode; + SkString fName; typedef Benchmark INHERITED; }; // Choose kSrcOver because it always allows coverage and alpha to be conflated. kSrc only allows // conflation when opaque, and kDarken because it isn't possilbe with standard GL blending. -DEF_BENCH(return new RotRectBench(true, kConstantOpaque_ColorType, SkBlendMode::kSrcOver);) -DEF_BENCH(return new RotRectBench(true, kConstantTransparent_ColorType, SkBlendMode::kSrcOver);) -DEF_BENCH(return new RotRectBench(true, kChangingOpaque_ColorType, SkBlendMode::kSrcOver);) -DEF_BENCH(return new RotRectBench(true, kChangingTransparent_ColorType, SkBlendMode::kSrcOver);) -DEF_BENCH(return new RotRectBench(true, kAlternatingOpaqueAndTransparent_ColorType, SkBlendMode::kSrcOver);) - -DEF_BENCH(return new RotRectBench(false, kConstantOpaque_ColorType, SkBlendMode::kSrcOver);) -DEF_BENCH(return new RotRectBench(false, kConstantTransparent_ColorType, SkBlendMode::kSrcOver);) -DEF_BENCH(return new RotRectBench(false, kChangingOpaque_ColorType, SkBlendMode::kSrcOver);) -DEF_BENCH(return new RotRectBench(false, kChangingTransparent_ColorType, SkBlendMode::kSrcOver);) -DEF_BENCH(return new RotRectBench(false, kAlternatingOpaqueAndTransparent_ColorType, SkBlendMode::kSrcOver);) - -DEF_BENCH(return new RotRectBench(true, kConstantOpaque_ColorType, SkBlendMode::kSrc);) -DEF_BENCH(return new RotRectBench(true, kConstantTransparent_ColorType, SkBlendMode::kSrc);) -DEF_BENCH(return new RotRectBench(true, kChangingOpaque_ColorType, SkBlendMode::kSrc);) -DEF_BENCH(return new RotRectBench(true, kChangingTransparent_ColorType, SkBlendMode::kSrc);) -DEF_BENCH(return new RotRectBench(true, kAlternatingOpaqueAndTransparent_ColorType, SkBlendMode::kSrc);) - -DEF_BENCH(return new RotRectBench(false, kConstantOpaque_ColorType, SkBlendMode::kSrc);) -DEF_BENCH(return new RotRectBench(false, kConstantTransparent_ColorType, SkBlendMode::kSrc);) -DEF_BENCH(return new RotRectBench(false, kChangingOpaque_ColorType, SkBlendMode::kSrc);) -DEF_BENCH(return new RotRectBench(false, kChangingTransparent_ColorType, SkBlendMode::kSrc);) -DEF_BENCH(return new RotRectBench(false, kAlternatingOpaqueAndTransparent_ColorType, SkBlendMode::kSrc);) - -DEF_BENCH(return new RotRectBench(true, kConstantOpaque_ColorType, SkBlendMode::kDarken);) -DEF_BENCH(return new RotRectBench(true, kConstantTransparent_ColorType, SkBlendMode::kDarken);) -DEF_BENCH(return new RotRectBench(true, kChangingOpaque_ColorType, SkBlendMode::kDarken);) -DEF_BENCH(return new RotRectBench(true, kChangingTransparent_ColorType, SkBlendMode::kDarken);) -DEF_BENCH(return new RotRectBench(true, kAlternatingOpaqueAndTransparent_ColorType, SkBlendMode::kDarken);) - -DEF_BENCH(return new RotRectBench(false, kConstantOpaque_ColorType, SkBlendMode::kDarken);) -DEF_BENCH(return new RotRectBench(false, kConstantTransparent_ColorType, SkBlendMode::kDarken);) -DEF_BENCH(return new RotRectBench(false, kChangingOpaque_ColorType, SkBlendMode::kDarken);) -DEF_BENCH(return new RotRectBench(false, kChangingTransparent_ColorType, SkBlendMode::kDarken);) -DEF_BENCH(return new RotRectBench(false, kAlternatingOpaqueAndTransparent_ColorType, SkBlendMode::kDarken);) +DEF_BENCH(return new RotRectBench(true, kConstantOpaque_ColorType, SkXfermode::kSrcOver_Mode);) +DEF_BENCH(return new RotRectBench(true, kConstantTransparent_ColorType, SkXfermode::kSrcOver_Mode);) +DEF_BENCH(return new RotRectBench(true, kChangingOpaque_ColorType, SkXfermode::kSrcOver_Mode);) +DEF_BENCH(return new RotRectBench(true, kChangingTransparent_ColorType, SkXfermode::kSrcOver_Mode);) +DEF_BENCH(return new RotRectBench(true, kAlternatingOpaqueAndTransparent_ColorType, SkXfermode::kSrcOver_Mode);) + +DEF_BENCH(return new RotRectBench(false, kConstantOpaque_ColorType, SkXfermode::kSrcOver_Mode);) +DEF_BENCH(return new RotRectBench(false, kConstantTransparent_ColorType, SkXfermode::kSrcOver_Mode);) +DEF_BENCH(return new RotRectBench(false, kChangingOpaque_ColorType, SkXfermode::kSrcOver_Mode);) +DEF_BENCH(return new RotRectBench(false, kChangingTransparent_ColorType, SkXfermode::kSrcOver_Mode);) +DEF_BENCH(return new RotRectBench(false, kAlternatingOpaqueAndTransparent_ColorType, SkXfermode::kSrcOver_Mode);) + +DEF_BENCH(return new RotRectBench(true, kConstantOpaque_ColorType, SkXfermode::kSrc_Mode);) +DEF_BENCH(return new RotRectBench(true, kConstantTransparent_ColorType, SkXfermode::kSrc_Mode);) +DEF_BENCH(return new RotRectBench(true, kChangingOpaque_ColorType, SkXfermode::kSrc_Mode);) +DEF_BENCH(return new RotRectBench(true, kChangingTransparent_ColorType, SkXfermode::kSrc_Mode);) +DEF_BENCH(return new RotRectBench(true, kAlternatingOpaqueAndTransparent_ColorType, SkXfermode::kSrc_Mode);) + +DEF_BENCH(return new RotRectBench(false, kConstantOpaque_ColorType, SkXfermode::kSrc_Mode);) +DEF_BENCH(return new RotRectBench(false, kConstantTransparent_ColorType, SkXfermode::kSrc_Mode);) +DEF_BENCH(return new RotRectBench(false, kChangingOpaque_ColorType, SkXfermode::kSrc_Mode);) +DEF_BENCH(return new RotRectBench(false, kChangingTransparent_ColorType, SkXfermode::kSrc_Mode);) +DEF_BENCH(return new RotRectBench(false, kAlternatingOpaqueAndTransparent_ColorType, SkXfermode::kSrc_Mode);) + +DEF_BENCH(return new RotRectBench(true, kConstantOpaque_ColorType, SkXfermode::kDarken_Mode);) +DEF_BENCH(return new RotRectBench(true, kConstantTransparent_ColorType, SkXfermode::kDarken_Mode);) +DEF_BENCH(return new RotRectBench(true, kChangingOpaque_ColorType, SkXfermode::kDarken_Mode);) +DEF_BENCH(return new RotRectBench(true, kChangingTransparent_ColorType, SkXfermode::kDarken_Mode);) +DEF_BENCH(return new RotRectBench(true, kAlternatingOpaqueAndTransparent_ColorType, SkXfermode::kDarken_Mode);) + +DEF_BENCH(return new RotRectBench(false, kConstantOpaque_ColorType, SkXfermode::kDarken_Mode);) +DEF_BENCH(return new RotRectBench(false, kConstantTransparent_ColorType, SkXfermode::kDarken_Mode);) +DEF_BENCH(return new RotRectBench(false, kChangingOpaque_ColorType, SkXfermode::kDarken_Mode);) +DEF_BENCH(return new RotRectBench(false, kChangingTransparent_ColorType, SkXfermode::kDarken_Mode);) +DEF_BENCH(return new RotRectBench(false, kAlternatingOpaqueAndTransparent_ColorType, SkXfermode::kDarken_Mode);) diff --git a/bench/XfermodeBench.cpp b/bench/XfermodeBench.cpp index 9e148d4..60879d6 100644 --- a/bench/XfermodeBench.cpp +++ b/bench/XfermodeBench.cpp @@ -15,8 +15,10 @@ // Benchmark that draws non-AA rects or AA text with an SkXfermode::Mode. class XfermodeBench : public Benchmark { public: - XfermodeBench(SkBlendMode mode, bool aa) : fBlendMode(mode) { + XfermodeBench(SkXfermode::Mode mode, bool aa) { + fXfermode = SkXfermode::Make(mode); fAA = aa; + SkASSERT(fXfermode.get() || SkXfermode::kSrcOver_Mode == mode); fName.printf("Xfermode_%s%s", SkXfermode::ModeName(mode), aa ? "_aa" : ""); } @@ -30,7 +32,7 @@ protected: SkRandom random; for (int i = 0; i < loops; ++i) { SkPaint paint; - paint.setBlendMode(fBlendMode); + paint.setXfermode(fXfermode); paint.setColor(random.nextU()); if (fAA) { // Draw text to exercise AA code paths. @@ -59,48 +61,71 @@ protected: } private: - SkBlendMode fBlendMode; - SkString fName; - bool fAA; + sk_sp fXfermode; + SkString fName; + bool fAA; typedef Benchmark INHERITED; }; +class XferCreateBench : public Benchmark { +public: + bool isSuitableFor(Backend backend) override { + return backend == kNonRendering_Backend; + } + +protected: + const char* onGetName() override { return "xfermode_create"; } + + void onDraw(int loops, SkCanvas* canvas) override { + for (int outer = 0; outer < loops * 10; ++outer) { + for (int i = 0; i <= SkXfermode::kLastMode; ++i) { + (void)SkXfermode::Make(SkXfermode::Mode(i)); + } + } + } + +private: + typedef Benchmark INHERITED; +}; + ////////////////////////////////////////////////////////////////////////////// #define BENCH(...) \ DEF_BENCH( return new XfermodeBench(__VA_ARGS__, true); ) \ DEF_BENCH( return new XfermodeBench(__VA_ARGS__, false); ) -BENCH(SkBlendMode::kClear) -BENCH(SkBlendMode::kSrc) -BENCH(SkBlendMode::kDst) -BENCH(SkBlendMode::kSrcOver) -BENCH(SkBlendMode::kDstOver) -BENCH(SkBlendMode::kSrcIn) -BENCH(SkBlendMode::kDstIn) -BENCH(SkBlendMode::kSrcOut) -BENCH(SkBlendMode::kDstOut) -BENCH(SkBlendMode::kSrcATop) -BENCH(SkBlendMode::kDstATop) -BENCH(SkBlendMode::kXor) - -BENCH(SkBlendMode::kPlus) -BENCH(SkBlendMode::kModulate) -BENCH(SkBlendMode::kScreen) - -BENCH(SkBlendMode::kOverlay) -BENCH(SkBlendMode::kDarken) -BENCH(SkBlendMode::kLighten) -BENCH(SkBlendMode::kColorDodge) -BENCH(SkBlendMode::kColorBurn) -BENCH(SkBlendMode::kHardLight) -BENCH(SkBlendMode::kSoftLight) -BENCH(SkBlendMode::kDifference) -BENCH(SkBlendMode::kExclusion) -BENCH(SkBlendMode::kMultiply) - -BENCH(SkBlendMode::kHue) -BENCH(SkBlendMode::kSaturation) -BENCH(SkBlendMode::kColor) -BENCH(SkBlendMode::kLuminosity) +BENCH(SkXfermode::kClear_Mode) +BENCH(SkXfermode::kSrc_Mode) +BENCH(SkXfermode::kDst_Mode) +BENCH(SkXfermode::kSrcOver_Mode) +BENCH(SkXfermode::kDstOver_Mode) +BENCH(SkXfermode::kSrcIn_Mode) +BENCH(SkXfermode::kDstIn_Mode) +BENCH(SkXfermode::kSrcOut_Mode) +BENCH(SkXfermode::kDstOut_Mode) +BENCH(SkXfermode::kSrcATop_Mode) +BENCH(SkXfermode::kDstATop_Mode) +BENCH(SkXfermode::kXor_Mode) + +BENCH(SkXfermode::kPlus_Mode) +BENCH(SkXfermode::kModulate_Mode) +BENCH(SkXfermode::kScreen_Mode) + +BENCH(SkXfermode::kOverlay_Mode) +BENCH(SkXfermode::kDarken_Mode) +BENCH(SkXfermode::kLighten_Mode) +BENCH(SkXfermode::kColorDodge_Mode) +BENCH(SkXfermode::kColorBurn_Mode) +BENCH(SkXfermode::kHardLight_Mode) +BENCH(SkXfermode::kSoftLight_Mode) +BENCH(SkXfermode::kDifference_Mode) +BENCH(SkXfermode::kExclusion_Mode) +BENCH(SkXfermode::kMultiply_Mode) + +BENCH(SkXfermode::kHue_Mode) +BENCH(SkXfermode::kSaturation_Mode) +BENCH(SkXfermode::kColor_Mode) +BENCH(SkXfermode::kLuminosity_Mode) + +DEF_BENCH(return new XferCreateBench;) diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp index 585a51d..0565ee9 100644 --- a/dm/DMSrcSink.cpp +++ b/dm/DMSrcSink.cpp @@ -1454,7 +1454,7 @@ Error ViaUpright::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkSt SkCanvas canvas(uprighted); canvas.concat(upright); SkPaint paint; - paint.setBlendMode(SkBlendMode::kSrc); + paint.setXfermodeMode(SkXfermode::kSrc_Mode); canvas.drawBitmap(*bitmap, 0, 0, &paint); *bitmap = uprighted; diff --git a/fuzz/FilterFuzz.cpp b/fuzz/FilterFuzz.cpp index e6f9cb3..6b766a2 100644 --- a/fuzz/FilterFuzz.cpp +++ b/fuzz/FilterFuzz.cpp @@ -154,8 +154,8 @@ static SkMatrix make_matrix() { return m; } -static SkBlendMode make_blendmode() { - return static_cast(R((int)SkBlendMode::kLastMode+1)); +static SkXfermode::Mode make_xfermode() { + return static_cast(R(SkXfermode::kLastMode+1)); } static SkPaint::Align make_paint_align() { @@ -369,7 +369,7 @@ static sk_sp make_color_filter() { return SkTableColorFilter::MakeARGB(tableA, tableR, tableG, tableB); } case 3: - return SkColorFilter::MakeModeFilter(make_color(), (SkXfermode::Mode)make_blendmode()); + return SkColorFilter::MakeModeFilter(make_color(), make_xfermode()); case 4: return SkColorMatrixFilter::MakeLightingFilter(make_color(), make_color()); case 5: @@ -505,7 +505,7 @@ static SkPaint make_paint() { paint.setStrokeCap(make_paint_cap()); paint.setStrokeJoin(make_paint_join()); paint.setColorFilter(make_color_filter()); - paint.setBlendMode(make_blendmode()); + paint.setXfermodeMode(make_xfermode()); paint.setPathEffect(make_path_effect()); paint.setMaskFilter(make_mask_filter()); @@ -540,7 +540,7 @@ static sk_sp make_image_filter(bool canBeNull) { } enum { ALPHA_THRESHOLD, MERGE, COLOR, LUT3D, BLUR, MAGNIFIER, - BLENDMODE, OFFSET, MATRIX, MATRIX_CONVOLUTION, COMPOSE, + XFERMODE, OFFSET, MATRIX, MATRIX_CONVOLUTION, COMPOSE, DISTANT_LIGHT, POINT_LIGHT, SPOT_LIGHT, NOISE, DROP_SHADOW, MORPHOLOGY, BITMAP, DISPLACE, TILE, PICTURE, PAINT, NUM_FILTERS }; @@ -554,7 +554,7 @@ static sk_sp make_image_filter(bool canBeNull) { case MERGE: filter = SkMergeImageFilter::Make(make_image_filter(), make_image_filter(), - (SkXfermode::Mode)make_blendmode()); + make_xfermode()); break; case COLOR: { sk_sp cf(make_color_filter()); @@ -580,8 +580,8 @@ static sk_sp make_image_filter(bool canBeNull) { make_scalar(true), make_image_filter()); break; - case BLENDMODE: - filter = SkXfermodeImageFilter::Make(make_blendmode(), + case XFERMODE: + filter = SkXfermodeImageFilter::Make(SkXfermode::Make(make_xfermode()), make_image_filter(), make_image_filter(), nullptr); diff --git a/gm/aaclip.cpp b/gm/aaclip.cpp index f00a4cd..26a25c1 100644 --- a/gm/aaclip.cpp +++ b/gm/aaclip.cpp @@ -11,7 +11,7 @@ static void do_draw(SkCanvas* canvas, const SkRect& r) { SkPaint paint; - paint.setBlendMode(SkBlendMode::kSrc); + paint.setXfermodeMode(SkXfermode::kSrc_Mode); paint.setColor(0x800000FF); canvas->drawRect(r, paint); } diff --git a/gm/aarectmodes.cpp b/gm/aarectmodes.cpp index ebc47c2..6e9f4bf 100644 --- a/gm/aarectmodes.cpp +++ b/gm/aarectmodes.cpp @@ -59,21 +59,21 @@ static void test4(SkCanvas* canvas) { } constexpr struct { - SkBlendMode fMode; - const char* fLabel; + SkXfermode::Mode fMode; + const char* fLabel; } gModes[] = { - { SkBlendMode::kClear, "Clear" }, - { SkBlendMode::kSrc, "Src" }, - { SkBlendMode::kDst, "Dst" }, - { SkBlendMode::kSrcOver, "SrcOver" }, - { SkBlendMode::kDstOver, "DstOver" }, - { SkBlendMode::kSrcIn, "SrcIn" }, - { SkBlendMode::kDstIn, "DstIn" }, - { SkBlendMode::kSrcOut, "SrcOut" }, - { SkBlendMode::kDstOut, "DstOut" }, - { SkBlendMode::kSrcATop, "SrcATop" }, - { SkBlendMode::kDstATop, "DstATop" }, - { SkBlendMode::kXor, "Xor" }, + { SkXfermode::kClear_Mode, "Clear" }, + { SkXfermode::kSrc_Mode, "Src" }, + { SkXfermode::kDst_Mode, "Dst" }, + { SkXfermode::kSrcOver_Mode, "SrcOver" }, + { SkXfermode::kDstOver_Mode, "DstOver" }, + { SkXfermode::kSrcIn_Mode, "SrcIn" }, + { SkXfermode::kDstIn_Mode, "DstIn" }, + { SkXfermode::kSrcOut_Mode, "SrcOut" }, + { SkXfermode::kDstOut_Mode, "DstOut" }, + { SkXfermode::kSrcATop_Mode, "SrcATop" }, + { SkXfermode::kDstATop_Mode, "DstATop" }, + { SkXfermode::kXor_Mode, "Xor" }, }; const int gWidth = 64; @@ -81,7 +81,7 @@ const int gHeight = 64; const SkScalar W = SkIntToScalar(gWidth); const SkScalar H = SkIntToScalar(gHeight); -static SkScalar drawCell(SkCanvas* canvas, SkBlendMode mode, SkAlpha a0, SkAlpha a1) { +static SkScalar drawCell(SkCanvas* canvas, sk_sp mode, SkAlpha a0, SkAlpha a1) { SkPaint paint; paint.setAntiAlias(true); @@ -95,7 +95,7 @@ static SkScalar drawCell(SkCanvas* canvas, SkBlendMode mode, SkAlpha a0, SkAlpha paint.setColor(SK_ColorRED); paint.setAlpha(a1); - paint.setBlendMode(mode); + paint.setXfermode(std::move(mode)); SkScalar offset = SK_Scalar1 / 3; SkRect rect = SkRect::MakeXYWH(W / 4 + offset, @@ -155,7 +155,7 @@ namespace skiagm { } canvas->drawRect(bounds, fBGPaint); canvas->saveLayer(&bounds, nullptr); - SkScalar dy = drawCell(canvas, gModes[i].fMode, + SkScalar dy = drawCell(canvas, SkXfermode::Make(gModes[i].fMode), gAlphaValue[alpha & 1], gAlphaValue[alpha & 2]); canvas->restore(); diff --git a/gm/aaxfermodes.cpp b/gm/aaxfermodes.cpp index 7106ce8..678a837 100644 --- a/gm/aaxfermodes.cpp +++ b/gm/aaxfermodes.cpp @@ -121,7 +121,7 @@ protected: if (firstMode + m > SkXfermode::kLastMode) { break; } - SkBlendMode mode = static_cast(firstMode + m); + SkXfermode::Mode mode = static_cast(firstMode + m); canvas->save(); if (kShape_Pass == drawingPass) { @@ -144,7 +144,7 @@ protected: 10); } else { SkASSERT(kBackground_Pass == drawingPass); - canvas->drawColor(kBGColor, SkBlendMode::kSrc); + canvas->drawColor(kBGColor, SkXfermode::kSrc_Mode); } canvas->restore(); } else { @@ -190,17 +190,18 @@ protected: canvas->restore(); } - void drawModeName(SkCanvas* canvas, SkBlendMode mode) { - const char* modeName = SkXfermode::ModeName(mode); + void drawModeName(SkCanvas* canvas, SkXfermode::Mode mode) { + const char* modeName = mode <= SkXfermode::kLastMode ? SkXfermode::ModeName(mode) + : "Arithmetic"; fLabelPaint.setTextAlign(SkPaint::kRight_Align); canvas->drawText(modeName, strlen(modeName), kLabelSpacing - kShapeSize / 4, fLabelPaint.getTextSize() / 4, fLabelPaint); } - void setupShapePaint(SkCanvas* canvas, GrColor color, SkBlendMode mode, SkPaint* paint) { + void setupShapePaint(SkCanvas* canvas, GrColor color, SkXfermode::Mode mode, SkPaint* paint) { paint->setColor(color); - if (mode == SkBlendMode::kPlus) { + if (mode == SkXfermode::kPlus_Mode) { // Check for overflow, otherwise we might get confusing AA artifacts. int maxSum = SkTMax(SkTMax(SkColorGetA(kBGColor) + SkColorGetA(color), SkColorGetR(kBGColor) + SkColorGetR(color)), @@ -210,7 +211,7 @@ protected: if (maxSum > 255) { SkPaint dimPaint; dimPaint.setAntiAlias(false); - dimPaint.setBlendMode(SkBlendMode::kDstIn); + dimPaint.setXfermodeMode(SkXfermode::kDstIn_Mode); if (255 != paint->getAlpha()) { // Dim the src and dst colors. dimPaint.setARGB(255 * 255 / maxSum, 0, 0, 0); @@ -226,11 +227,11 @@ protected: } } - void drawShape(SkCanvas* canvas, Shape shape, const SkPaint& paint, SkBlendMode mode) { - SkASSERT(mode <= SkBlendMode::kLastMode); + void drawShape(SkCanvas* canvas, Shape shape, const SkPaint& paint, SkXfermode::Mode mode) { + SkASSERT(mode <= SkXfermode::kLastMode); SkPaint shapePaint(paint); shapePaint.setAntiAlias(kSquare_Shape != shape); - shapePaint.setBlendMode(mode); + shapePaint.setXfermodeMode(mode); switch (shape) { case kSquare_Shape: @@ -248,7 +249,7 @@ protected: case kOval_Shape: canvas->save(); - canvas->rotate(static_cast((511 * (int)mode + 257) % 360)); + canvas->rotate(static_cast((511 * mode + 257) % 360)); canvas->drawPath(fOval, shapePaint); canvas->restore(); break; diff --git a/gm/bitmaprect.cpp b/gm/bitmaprect.cpp index 06bf36a..2a81300 100644 --- a/gm/bitmaprect.cpp +++ b/gm/bitmaprect.cpp @@ -201,7 +201,7 @@ protected: void onDraw(SkCanvas* canvas) override { SkPaint paint; paint.setAlpha(128); - paint.setBlendMode(SkBlendMode::kXor); + paint.setXfermode(SkXfermode::Make(SkXfermode::kXor_Mode)); SkRect srcR1 = { 0.0f, 0.0f, 4096.0f, 2040.0f }; SkRect dstR1 = { 10.1f, 10.1f, 629.9f, 400.9f }; diff --git a/gm/blurredclippedcircle.cpp b/gm/blurredclippedcircle.cpp index a0359c3..a087064 100644 --- a/gm/blurredclippedcircle.cpp +++ b/gm/blurredclippedcircle.cpp @@ -34,7 +34,7 @@ protected: void onDraw(SkCanvas* canvas) override { SkPaint whitePaint; whitePaint.setColor(SK_ColorWHITE); - whitePaint.setBlendMode(SkBlendMode::kSrc); + whitePaint.setXfermode(SkXfermode::Make(SkXfermode::kSrc_Mode)); whitePaint.setAntiAlias(true); // This scale exercises precision limits in the circle blur effect (crbug.com/560651) diff --git a/gm/colormatrix.cpp b/gm/colormatrix.cpp index f6d51fc..202f72a 100644 --- a/gm/colormatrix.cpp +++ b/gm/colormatrix.cpp @@ -77,7 +77,7 @@ protected: SkPaint paint; SkColorMatrix matrix; - paint.setBlendMode(SkBlendMode::kSrc); + paint.setXfermodeMode(SkXfermode::kSrc_Mode); const SkImage* bmps[] = { fSolidImg.get(), fTransparentImg.get() }; for (size_t i = 0; i < SK_ARRAY_COUNT(bmps); ++i) { diff --git a/gm/colortypexfermode.cpp b/gm/colortypexfermode.cpp index 9b715ef..554282f 100644 --- a/gm/colortypexfermode.cpp +++ b/gm/colortypexfermode.cpp @@ -57,39 +57,39 @@ protected: canvas->translate(SkIntToScalar(10), SkIntToScalar(20)); const struct { - SkBlendMode fMode; - const char* fLabel; + SkXfermode::Mode fMode; + const char* fLabel; } gModes[] = { - { SkBlendMode::kClear, "Clear" }, - { SkBlendMode::kSrc, "Src" }, - { SkBlendMode::kDst, "Dst" }, - { SkBlendMode::kSrcOver, "SrcOver" }, - { SkBlendMode::kDstOver, "DstOver" }, - { SkBlendMode::kSrcIn, "SrcIn" }, - { SkBlendMode::kDstIn, "DstIn" }, - { SkBlendMode::kSrcOut, "SrcOut" }, - { SkBlendMode::kDstOut, "DstOut" }, - { SkBlendMode::kSrcATop, "SrcATop" }, - { SkBlendMode::kDstATop, "DstATop" }, - - { SkBlendMode::kXor, "Xor" }, - { SkBlendMode::kPlus, "Plus" }, - { SkBlendMode::kModulate, "Modulate" }, - { SkBlendMode::kScreen, "Screen" }, - { SkBlendMode::kOverlay, "Overlay" }, - { SkBlendMode::kDarken, "Darken" }, - { SkBlendMode::kLighten, "Lighten" }, - { SkBlendMode::kColorDodge, "ColorDodge" }, - { SkBlendMode::kColorBurn, "ColorBurn" }, - { SkBlendMode::kHardLight, "HardLight" }, - { SkBlendMode::kSoftLight, "SoftLight" }, - { SkBlendMode::kDifference, "Difference" }, - { SkBlendMode::kExclusion, "Exclusion" }, - { SkBlendMode::kMultiply, "Multiply" }, - { SkBlendMode::kHue, "Hue" }, - { SkBlendMode::kSaturation, "Saturation" }, - { SkBlendMode::kColor, "Color" }, - { SkBlendMode::kLuminosity, "Luminosity" }, + { SkXfermode::kClear_Mode, "Clear" }, + { SkXfermode::kSrc_Mode, "Src" }, + { SkXfermode::kDst_Mode, "Dst" }, + { SkXfermode::kSrcOver_Mode, "SrcOver" }, + { SkXfermode::kDstOver_Mode, "DstOver" }, + { SkXfermode::kSrcIn_Mode, "SrcIn" }, + { SkXfermode::kDstIn_Mode, "DstIn" }, + { SkXfermode::kSrcOut_Mode, "SrcOut" }, + { SkXfermode::kDstOut_Mode, "DstOut" }, + { SkXfermode::kSrcATop_Mode, "SrcATop" }, + { SkXfermode::kDstATop_Mode, "DstATop" }, + + { SkXfermode::kXor_Mode, "Xor" }, + { SkXfermode::kPlus_Mode, "Plus" }, + { SkXfermode::kModulate_Mode, "Modulate" }, + { SkXfermode::kScreen_Mode, "Screen" }, + { SkXfermode::kOverlay_Mode, "Overlay" }, + { SkXfermode::kDarken_Mode, "Darken" }, + { SkXfermode::kLighten_Mode, "Lighten" }, + { SkXfermode::kColorDodge_Mode, "ColorDodge" }, + { SkXfermode::kColorBurn_Mode, "ColorBurn" }, + { SkXfermode::kHardLight_Mode, "HardLight" }, + { SkXfermode::kSoftLight_Mode, "SoftLight" }, + { SkXfermode::kDifference_Mode, "Difference" }, + { SkXfermode::kExclusion_Mode, "Exclusion" }, + { SkXfermode::kMultiply_Mode, "Multiply" }, + { SkXfermode::kHue_Mode, "Hue" }, + { SkXfermode::kSaturation_Mode, "Saturation" }, + { SkXfermode::kColor_Mode, "Color" }, + { SkXfermode::kLuminosity_Mode, "Luminosity" }, }; const SkScalar w = SkIntToScalar(W); @@ -128,7 +128,7 @@ protected: p.setShader(nullptr); canvas->drawRect(r, p); - textP.setBlendMode(gModes[i].fMode); + textP.setXfermode(SkXfermode::Make(gModes[i].fMode)); canvas->drawText("H", 1, x+ w/10.f, y + 7.f*h/8.f, textP); #if 1 canvas->drawText(gModes[i].fLabel, strlen(gModes[i].fLabel), diff --git a/gm/drawatlas.cpp b/gm/drawatlas.cpp index 43b103c..dd81628 100644 --- a/gm/drawatlas.cpp +++ b/gm/drawatlas.cpp @@ -23,12 +23,12 @@ class DrawAtlasGM : public skiagm::GM { canvas->clear(SK_ColorRED); SkPaint paint; - paint.setBlendMode(SkBlendMode::kClear); + paint.setXfermodeMode(SkXfermode::kClear_Mode); SkRect r(target); r.inset(-1, -1); // zero out a place (with a 1-pixel border) to land our drawing. canvas->drawRect(r, paint); - paint.setBlendMode(SkBlendMode::kSrcOver); + paint.setXfermode(nullptr); paint.setColor(SK_ColorBLUE); paint.setAntiAlias(true); canvas->drawOval(target, paint); diff --git a/gm/drawatlascolor.cpp b/gm/drawatlascolor.cpp index bf76c48..d7b973c 100644 --- a/gm/drawatlascolor.cpp +++ b/gm/drawatlascolor.cpp @@ -26,7 +26,7 @@ static sk_sp make_atlas(SkCanvas* caller, int atlasSize) { SkCanvas* canvas = surface->getCanvas(); SkPaint paint; - paint.setBlendMode(SkBlendMode::kSrc); + paint.setXfermode(SkXfermode::Make(SkXfermode::kSrc_Mode)); paint.setColor(SK_ColorWHITE); SkRect r = SkRect::MakeXYWH(0, 0, diff --git a/gm/dstreadshuffle.cpp b/gm/dstreadshuffle.cpp index 72a68b1..47c7056 100644 --- a/gm/dstreadshuffle.cpp +++ b/gm/dstreadshuffle.cpp @@ -159,8 +159,8 @@ protected: p.setColor(color); // In order to get some batching on the GPU backend we do 2 src over for // each xfer mode which requires a dst read - p.setBlendMode(r % 3 == 0 ? SkBlendMode::kLighten : - SkBlendMode::kSrcOver); + p.setXfermodeMode(r % 3 == 0 ? SkXfermode::kLighten_Mode : + SkXfermode::kSrcOver_Mode); SetStyle(&p, style, width); canvas->save(); canvas->translate(x, y); diff --git a/gm/gamma.cpp b/gm/gamma.cpp index 80209e5..f6b4a9c 100644 --- a/gm/gamma.cpp +++ b/gm/gamma.cpp @@ -75,11 +75,11 @@ DEF_SIMPLE_GM(gamma, canvas, 850, 200) { advance(); }; - auto nextXferRect = [&](SkColor srcColor, SkBlendMode mode, SkColor dstColor) { + auto nextXferRect = [&](SkColor srcColor, SkXfermode::Mode mode, SkColor dstColor) { p.setColor(dstColor); canvas->drawRect(r, p); p.setColor(srcColor); - p.setBlendMode(mode); + p.setXfermodeMode(mode); canvas->drawRect(r, p); SkString srcText = SkStringPrintf("%08X", srcColor); @@ -207,18 +207,18 @@ DEF_SIMPLE_GM(gamma, canvas, 850, 200) { canvas->saveLayer(nullptr, nullptr); - nextXferRect(0x7fffffff, SkBlendMode::kSrcOver, SK_ColorBLACK); - nextXferRect(0x7f000000, SkBlendMode::kSrcOver, SK_ColorWHITE); + nextXferRect(0x7fffffff, SkXfermode::kSrcOver_Mode, SK_ColorBLACK); + nextXferRect(0x7f000000, SkXfermode::kSrcOver_Mode, SK_ColorWHITE); - nextXferRect(SK_ColorBLACK, SkBlendMode::kDstOver, 0x7fffffff); - nextXferRect(SK_ColorWHITE, SkBlendMode::kSrcIn, 0x7fff00ff); - nextXferRect(0x7fff00ff, SkBlendMode::kDstIn, SK_ColorWHITE); + nextXferRect(SK_ColorBLACK, SkXfermode::kDstOver_Mode, 0x7fffffff); + nextXferRect(SK_ColorWHITE, SkXfermode::kSrcIn_Mode, 0x7fff00ff); + nextXferRect(0x7fff00ff, SkXfermode::kDstIn_Mode, SK_ColorWHITE); // 0x89 = 255 * linear_to_srgb(0.25) - nextXferRect(0xff898989, SkBlendMode::kPlus, 0xff898989); + nextXferRect(0xff898989, SkXfermode::kPlus_Mode, 0xff898989); // 0xDB = 255 * linear_to_srgb(sqrt(0.5)) - nextXferRect(0xffdbdbdb, SkBlendMode::kModulate, 0xffdbdbdb); + nextXferRect(0xffdbdbdb, SkXfermode::kModulate_Mode, 0xffdbdbdb); canvas->restore(); } diff --git a/gm/gm.cpp b/gm/gm.cpp index 1b0598f..b6cac0c 100644 --- a/gm/gm.cpp +++ b/gm/gm.cpp @@ -58,7 +58,7 @@ bool GM::animate(const SkAnimTimer& timer) { ///////////////////////////////////////////////////////////////////////////////////////////// void GM::onDrawBackground(SkCanvas* canvas) { - canvas->drawColor(fBGColor, SkBlendMode::kSrc); + canvas->drawColor(fBGColor, SkXfermode::kSrc_Mode); } void GM::drawSizeBounds(SkCanvas* canvas, SkColor color) { diff --git a/gm/hairmodes.cpp b/gm/hairmodes.cpp index a628f4a..de937c4 100644 --- a/gm/hairmodes.cpp +++ b/gm/hairmodes.cpp @@ -11,21 +11,21 @@ #include "SkShader.h" constexpr struct { - SkBlendMode fMode; - const char* fLabel; + SkXfermode::Mode fMode; + const char* fLabel; } gModes[] = { - { SkBlendMode::kClear, "Clear" }, - { SkBlendMode::kSrc, "Src" }, - { SkBlendMode::kDst, "Dst" }, - { SkBlendMode::kSrcOver, "SrcOver" }, - { SkBlendMode::kDstOver, "DstOver" }, - { SkBlendMode::kSrcIn, "SrcIn" }, - { SkBlendMode::kDstIn, "DstIn" }, - { SkBlendMode::kSrcOut, "SrcOut" }, - { SkBlendMode::kDstOut, "DstOut" }, - { SkBlendMode::kSrcATop, "SrcATop" }, - { SkBlendMode::kDstATop, "DstATop" }, - { SkBlendMode::kXor, "Xor" }, + { SkXfermode::kClear_Mode, "Clear" }, + { SkXfermode::kSrc_Mode, "Src" }, + { SkXfermode::kDst_Mode, "Dst" }, + { SkXfermode::kSrcOver_Mode, "SrcOver" }, + { SkXfermode::kDstOver_Mode, "DstOver" }, + { SkXfermode::kSrcIn_Mode, "SrcIn" }, + { SkXfermode::kDstIn_Mode, "DstIn" }, + { SkXfermode::kSrcOut_Mode, "SrcOut" }, + { SkXfermode::kDstOut_Mode, "DstOut" }, + { SkXfermode::kSrcATop_Mode, "SrcATop" }, + { SkXfermode::kDstATop_Mode, "DstATop" }, + { SkXfermode::kXor_Mode, "Xor" }, }; const int gWidth = 64; @@ -33,7 +33,7 @@ const int gHeight = 64; const SkScalar W = SkIntToScalar(gWidth); const SkScalar H = SkIntToScalar(gHeight); -static SkScalar drawCell(SkCanvas* canvas, SkBlendMode mode, SkAlpha a0, SkAlpha a1) { +static SkScalar drawCell(SkCanvas* canvas, sk_sp mode, SkAlpha a0, SkAlpha a1) { SkPaint paint; paint.setAntiAlias(true); @@ -47,7 +47,7 @@ static SkScalar drawCell(SkCanvas* canvas, SkBlendMode mode, SkAlpha a0, SkAlpha paint.setColor(SK_ColorRED); paint.setAlpha(a1); - paint.setBlendMode(mode); + paint.setXfermode(std::move(mode)); for (int angle = 0; angle < 24; ++angle) { SkScalar x = SkScalarCos(SkIntToScalar(angle) * (SK_ScalarPI * 2) / 24) * gWidth; SkScalar y = SkScalarSin(SkIntToScalar(angle) * (SK_ScalarPI * 2) / 24) * gHeight; @@ -104,7 +104,7 @@ namespace skiagm { canvas->drawRect(bounds, fBGPaint); canvas->saveLayer(&bounds, nullptr); - SkScalar dy = drawCell(canvas, gModes[i].fMode, + SkScalar dy = drawCell(canvas, SkXfermode::Make(gModes[i].fMode), gAlphaValue[alpha & 1], gAlphaValue[alpha & 2]); canvas->restore(); diff --git a/gm/imagefilters.cpp b/gm/imagefilters.cpp index 27422b5..e9f54a3 100644 --- a/gm/imagefilters.cpp +++ b/gm/imagefilters.cpp @@ -19,7 +19,7 @@ * * see https://bug.skia.org/3741 */ -static void do_draw(SkCanvas* canvas, SkBlendMode mode, sk_sp imf) { +static void do_draw(SkCanvas* canvas, SkXfermode::Mode mode, sk_sp imf) { SkAutoCanvasRestore acr(canvas, true); canvas->clipRect(SkRect::MakeWH(220, 220)); @@ -40,7 +40,7 @@ static void do_draw(SkCanvas* canvas, SkBlendMode mode, sk_sp imf paint.setColor(0x660000FF); paint.setImageFilter(std::move(imf)); - paint.setBlendMode(mode); + paint.setXfermodeMode(mode); canvas->drawOval(r1, paint); } @@ -52,8 +52,8 @@ DEF_SIMPLE_GM(imagefilters_xfermodes, canvas, 480, 480) { kNone_SkFilterQuality, nullptr)); - const SkBlendMode modes[] = { - SkBlendMode::kSrcATop, SkBlendMode::kDstIn + const SkXfermode::Mode modes[] = { + SkXfermode::kSrcATop_Mode, SkXfermode::kDstIn_Mode }; for (size_t i = 0; i < SK_ARRAY_COUNT(modes); ++i) { diff --git a/gm/imagefiltersgraph.cpp b/gm/imagefiltersgraph.cpp index 2d27728..9803989 100644 --- a/gm/imagefiltersgraph.cpp +++ b/gm/imagefiltersgraph.cpp @@ -69,8 +69,9 @@ protected: sk_sp colorMorph(SkColorFilterImageFilter::Make(std::move(matrixFilter), std::move(morph))); SkPaint paint; - paint.setImageFilter(SkXfermodeImageFilter::Make(SkBlendMode::kSrcOver, - std::move(colorMorph))); + paint.setImageFilter(SkXfermodeImageFilter::Make( + SkXfermode::Make(SkXfermode::kSrcOver_Mode), + std::move(colorMorph))); DrawClippedImage(canvas, fImage.get(), paint); canvas->translate(SkIntToScalar(100), 0); @@ -104,8 +105,9 @@ protected: SkImageFilter::CropRect cropRect(SkRect::MakeWH(SkIntToScalar(95), SkIntToScalar(100))); SkPaint paint; paint.setImageFilter( - SkXfermodeImageFilter::Make(SkBlendMode::kSrcIn, std::move(blur), nullptr, - &cropRect)); + SkXfermodeImageFilter::Make(SkXfermode::Make(SkXfermode::kSrcIn_Mode), + std::move(blur), + nullptr, &cropRect)); DrawClippedImage(canvas, fImage.get(), paint); canvas->translate(SkIntToScalar(100), 0); } diff --git a/gm/imagefilterstransformed.cpp b/gm/imagefilterstransformed.cpp index dc8257c..0906eb3 100644 --- a/gm/imagefilterstransformed.cpp +++ b/gm/imagefilterstransformed.cpp @@ -127,7 +127,7 @@ DEF_SIMPLE_GM(rotate_imagefilter, canvas, 500, 500) { sk_sp filters[] = { nullptr, SkBlurImageFilter::Make(6, 0, nullptr), - SkXfermodeImageFilter::Make(SkBlendMode::kSrcOver, nullptr), + SkXfermodeImageFilter::Make(SkXfermode::Make(SkXfermode::kSrcOver_Mode), nullptr), }; for (auto& filter : filters) { diff --git a/gm/lcdblendmodes.cpp b/gm/lcdblendmodes.cpp index a16e219..537c4cb 100644 --- a/gm/lcdblendmodes.cpp +++ b/gm/lcdblendmodes.cpp @@ -76,44 +76,44 @@ protected: this->drawColumn(surfCanvas, SK_ColorCYAN, SK_ColorMAGENTA, true); SkPaint surfPaint; - surfPaint.setBlendMode(SkBlendMode::kSrcOver); + surfPaint.setXfermode(SkXfermode::Make(SkXfermode::kSrcOver_Mode)); surface->draw(canvas, 0, 0, &surfPaint); } void drawColumn(SkCanvas* canvas, SkColor backgroundColor, SkColor textColor, bool useGrad) { const struct { - SkBlendMode fMode; - const char* fLabel; + SkXfermode::Mode fMode; + const char* fLabel; } gModes[] = { - { SkBlendMode::kClear, "Clear" }, - { SkBlendMode::kSrc, "Src" }, - { SkBlendMode::kDst, "Dst" }, - { SkBlendMode::kSrcOver, "SrcOver" }, - { SkBlendMode::kDstOver, "DstOver" }, - { SkBlendMode::kSrcIn, "SrcIn" }, - { SkBlendMode::kDstIn, "DstIn" }, - { SkBlendMode::kSrcOut, "SrcOut" }, - { SkBlendMode::kDstOut, "DstOut" }, - { SkBlendMode::kSrcATop, "SrcATop" }, - { SkBlendMode::kDstATop, "DstATop" }, - { SkBlendMode::kXor, "Xor" }, - { SkBlendMode::kPlus, "Plus" }, - { SkBlendMode::kModulate, "Modulate" }, - { SkBlendMode::kScreen, "Screen" }, - { SkBlendMode::kOverlay, "Overlay" }, - { SkBlendMode::kDarken, "Darken" }, - { SkBlendMode::kLighten, "Lighten" }, - { SkBlendMode::kColorDodge, "ColorDodge" }, - { SkBlendMode::kColorBurn, "ColorBurn" }, - { SkBlendMode::kHardLight, "HardLight" }, - { SkBlendMode::kSoftLight, "SoftLight" }, - { SkBlendMode::kDifference, "Difference" }, - { SkBlendMode::kExclusion, "Exclusion" }, - { SkBlendMode::kMultiply, "Multiply" }, - { SkBlendMode::kHue, "Hue" }, - { SkBlendMode::kSaturation, "Saturation" }, - { SkBlendMode::kColor, "Color" }, - { SkBlendMode::kLuminosity, "Luminosity" }, + { SkXfermode::kClear_Mode, "Clear" }, + { SkXfermode::kSrc_Mode, "Src" }, + { SkXfermode::kDst_Mode, "Dst" }, + { SkXfermode::kSrcOver_Mode, "SrcOver" }, + { SkXfermode::kDstOver_Mode, "DstOver" }, + { SkXfermode::kSrcIn_Mode, "SrcIn" }, + { SkXfermode::kDstIn_Mode, "DstIn" }, + { SkXfermode::kSrcOut_Mode, "SrcOut" }, + { SkXfermode::kDstOut_Mode, "DstOut" }, + { SkXfermode::kSrcATop_Mode, "SrcATop" }, + { SkXfermode::kDstATop_Mode, "DstATop" }, + { SkXfermode::kXor_Mode, "Xor" }, + { SkXfermode::kPlus_Mode, "Plus" }, + { SkXfermode::kModulate_Mode, "Modulate" }, + { SkXfermode::kScreen_Mode, "Screen" }, + { SkXfermode::kOverlay_Mode, "Overlay" }, + { SkXfermode::kDarken_Mode, "Darken" }, + { SkXfermode::kLighten_Mode, "Lighten" }, + { SkXfermode::kColorDodge_Mode, "ColorDodge" }, + { SkXfermode::kColorBurn_Mode, "ColorBurn" }, + { SkXfermode::kHardLight_Mode, "HardLight" }, + { SkXfermode::kSoftLight_Mode, "SoftLight" }, + { SkXfermode::kDifference_Mode, "Difference" }, + { SkXfermode::kExclusion_Mode, "Exclusion" }, + { SkXfermode::kMultiply_Mode, "Multiply" }, + { SkXfermode::kHue_Mode, "Hue" }, + { SkXfermode::kSaturation_Mode, "Saturation" }, + { SkXfermode::kColor_Mode, "Color" }, + { SkXfermode::kLuminosity_Mode, "Luminosity" }, }; // Draw background rect SkPaint backgroundPaint; @@ -128,7 +128,7 @@ protected: paint.setSubpixelText(true); paint.setLCDRenderText(true); paint.setTextSize(fTextHeight); - paint.setBlendMode(gModes[m].fMode); + paint.setXfermode(SkXfermode::Make(gModes[m].fMode)); sk_tool_utils::set_portable_typeface(&paint); if (useGrad) { SkRect r; diff --git a/gm/lcdoverlap.cpp b/gm/lcdoverlap.cpp index 3808785..623d746 100644 --- a/gm/lcdoverlap.cpp +++ b/gm/lcdoverlap.cpp @@ -49,8 +49,8 @@ protected: SkISize onISize() override { return SkISize::Make(kWidth, kHeight); } - void drawTestCase(SkCanvas* canvas, SkScalar x, SkScalar y, SkBlendMode mode, - SkBlendMode mode2) { + void drawTestCase(SkCanvas* canvas, SkScalar x, SkScalar y, SkXfermode::Mode mode, + SkXfermode::Mode mode2) { const SkColor colors[] { SK_ColorRED, SK_ColorGREEN, @@ -60,6 +60,8 @@ protected: SK_ColorMAGENTA, }; + sk_sp xfermode(SkXfermode::Make(mode)); + sk_sp xfermode2(SkXfermode::Make(mode2)); for (size_t i = 0; i < SK_ARRAY_COUNT(colors); i++) { canvas->save(); canvas->translate(x, y); @@ -68,7 +70,7 @@ protected: SkPaint textPaint; textPaint.setColor(colors[i]); - textPaint.setBlendMode(i % 2 == 0 ? mode : mode2); + textPaint.setXfermode(i % 2 == 0 ? xfermode : xfermode2); canvas->drawTextBlob(fBlob, 0, 0, textPaint); canvas->restore(); } @@ -77,11 +79,13 @@ protected: void onDraw(SkCanvas* canvas) override { SkScalar offsetX = kWidth / 4.0f; SkScalar offsetY = kHeight / 4.0f; - drawTestCase(canvas, offsetX, offsetY, SkBlendMode::kSrc, SkBlendMode::kSrc); - drawTestCase(canvas, 3 * offsetX, offsetY, SkBlendMode::kSrcOver, SkBlendMode::kSrcOver); - drawTestCase(canvas, offsetX, 3 * offsetY, SkBlendMode::kHardLight, - SkBlendMode::kLuminosity); - drawTestCase(canvas, 3 * offsetX, 3 * offsetY, SkBlendMode::kSrcOver, SkBlendMode::kSrc); + drawTestCase(canvas, offsetX, offsetY, SkXfermode::kSrc_Mode, SkXfermode::kSrc_Mode); + drawTestCase(canvas, 3 * offsetX, offsetY, SkXfermode::kSrcOver_Mode, + SkXfermode::kSrcOver_Mode); + drawTestCase(canvas, offsetX, 3 * offsetY, SkXfermode::kHardLight_Mode, + SkXfermode::kLuminosity_Mode); + drawTestCase(canvas, 3 * offsetX, 3 * offsetY, SkXfermode::kSrcOver_Mode, + SkXfermode::kSrc_Mode); } private: diff --git a/gm/lumafilter.cpp b/gm/lumafilter.cpp index 3852d93..10eefab 100644 --- a/gm/lumafilter.cpp +++ b/gm/lumafilter.cpp @@ -26,7 +26,7 @@ static void draw_label(SkCanvas* canvas, const char* label, paint); } -static void draw_scene(SkCanvas* canvas, const sk_sp& filter, SkBlendMode mode, +static void draw_scene(SkCanvas* canvas, const sk_sp& filter, SkXfermode::Mode mode, const sk_sp& s1, const sk_sp& s2) { SkPaint paint; paint.setAntiAlias(true); @@ -53,7 +53,7 @@ static void draw_scene(SkCanvas* canvas, const sk_sp& filter, SkB } SkPaint xferPaint; - xferPaint.setBlendMode(mode); + xferPaint.setXfermodeMode(mode); canvas->saveLayer(&bounds, &xferPaint); r = bounds; @@ -101,14 +101,13 @@ protected: } void onDraw(SkCanvas* canvas) override { - SkBlendMode modes[] = { - SkBlendMode::kSrcOver, - SkBlendMode::kDstOver, - SkBlendMode::kSrcATop, - SkBlendMode::kDstATop, - SkBlendMode::kSrcIn, - SkBlendMode::kDstIn, - }; + SkXfermode::Mode modes[] = { SkXfermode::kSrcOver_Mode, + SkXfermode::kDstOver_Mode, + SkXfermode::kSrcATop_Mode, + SkXfermode::kDstATop_Mode, + SkXfermode::kSrcIn_Mode, + SkXfermode::kDstIn_Mode, + }; struct { const sk_sp& fShader1; const sk_sp& fShader2; diff --git a/gm/modecolorfilters.cpp b/gm/modecolorfilters.cpp index ae926ef..50bb27f 100644 --- a/gm/modecolorfilters.cpp +++ b/gm/modecolorfilters.cpp @@ -78,7 +78,7 @@ protected: } SkPaint bgPaint; bgPaint.setShader(fBmpShader); - bgPaint.setBlendMode(SkBlendMode::kSrc); + bgPaint.setXfermodeMode(SkXfermode::kSrc_Mode); sk_sp shaders[] = { nullptr, // use a paint color instead of a shader diff --git a/gm/picture.cpp b/gm/picture.cpp index 72d4159..1ea8ada 100644 --- a/gm/picture.cpp +++ b/gm/picture.cpp @@ -29,7 +29,7 @@ static sk_sp make_picture() { canvas->drawPath(path, paint); paint.setColor(0x80FFFFFF); - paint.setBlendMode(SkBlendMode::kPlus); + paint.setXfermodeMode(SkXfermode::kPlus_Mode); canvas->drawRect(SkRect::MakeXYWH(25, 25, 50, 50), paint); return rec.finishRecordingAsPicture(); diff --git a/gm/plus.cpp b/gm/plus.cpp index 51ac2cb..6a5af61 100644 --- a/gm/plus.cpp +++ b/gm/plus.cpp @@ -37,7 +37,7 @@ DEF_SIMPLE_GM(PlusMergesAA, canvas, 256, 256) { // Using Plus on the right should merge the AA of seam together completely covering the red. canvas->saveLayer(nullptr, nullptr); - p.setBlendMode(SkBlendMode::kPlus); + p.setXfermodeMode(SkXfermode::kPlus_Mode); canvas->translate(150, 0); canvas->drawPath(upperLeft, p); canvas->drawPath(bottomRight, p); diff --git a/gm/srcmode.cpp b/gm/srcmode.cpp index d57b77c..0d02cdc 100644 --- a/gm/srcmode.cpp +++ b/gm/srcmode.cpp @@ -82,8 +82,8 @@ protected: draw_hair, draw_thick, draw_rect, draw_oval, draw_text }; - const SkBlendMode modes[] = { - SkBlendMode::kSrcOver, SkBlendMode::kSrc, SkBlendMode::kClear + const SkXfermode::Mode modes[] = { + SkXfermode::kSrcOver_Mode, SkXfermode::kSrc_Mode, SkXfermode::kClear_Mode }; const PaintProc paintProcs[] = { @@ -96,7 +96,7 @@ protected: for (size_t i = 0; i < SK_ARRAY_COUNT(paintProcs); ++i) { paintProcs[i](&paint); for (size_t x = 0; x < SK_ARRAY_COUNT(modes); ++x) { - paint.setBlendMode(modes[x]); + paint.setXfermodeMode(modes[x]); canvas->save(); for (size_t y = 0; y < SK_ARRAY_COUNT(procs); ++y) { procs[y](canvas, paint); diff --git a/gm/textblobblockreordering.cpp b/gm/textblobblockreordering.cpp index c581e13..3974aca 100644 --- a/gm/textblobblockreordering.cpp +++ b/gm/textblobblockreordering.cpp @@ -69,7 +69,7 @@ protected: redPaint.setColor(SK_ColorRED); canvas->drawRect(bounds, redPaint); SkPaint srcInPaint(paint); - srcInPaint.setBlendMode(SkBlendMode::kSrcIn); + srcInPaint.setXfermodeMode(SkXfermode::kSrcIn_Mode); canvas->drawTextBlob(fBlob, 0, 0, srcInPaint); canvas->translate(SkIntToScalar(xDelta), SkIntToScalar(yDelta)); diff --git a/gm/textbloblooper.cpp b/gm/textbloblooper.cpp index 37eae66..3adf349 100644 --- a/gm/textbloblooper.cpp +++ b/gm/textbloblooper.cpp @@ -51,7 +51,7 @@ static void add_to_text_blob(SkTextBlobBuilder* builder, const char* text, const typedef void (*LooperProc)(SkPaint*); struct LooperSettings { - SkBlendMode fMode; + SkXfermode::Mode fMode; SkColor fColor; SkPaint::Style fStyle; SkScalar fWidth; @@ -120,7 +120,7 @@ static sk_sp setupLooper(SkLayerDrawLooper::BitFlags bits, for (size_t i = 0; i < size; i++) { info.fOffset.set(settings[i].fOffset, settings[i].fOffset); SkPaint* paint = looperBuilder.addLayer(info); - paint->setBlendMode(settings[i].fMode); + paint->setXfermodeMode(settings[i].fMode); paint->setColor(settings[i].fColor); paint->setStyle(settings[i].fStyle); paint->setStrokeWidth(settings[i].fWidth); @@ -152,37 +152,37 @@ protected: // create a looper which sandwhiches an effect in two normal draws LooperSettings looperSandwhich[] = { - { SkBlendMode::kSrc, SK_ColorMAGENTA, SkPaint::kFill_Style, 0, 0, 0, false }, - { SkBlendMode::kSrcOver, 0x88000000, SkPaint::kFill_Style, 0, 10.f, 0, true }, - { SkBlendMode::kSrcOver, 0x50FF00FF, SkPaint::kFill_Style, 0, 20.f, 0, false }, + { SkXfermode::kSrc_Mode, SK_ColorMAGENTA, SkPaint::kFill_Style, 0, 0, 0, false }, + { SkXfermode::kSrcOver_Mode, 0x88000000, SkPaint::kFill_Style, 0, 10.f, 0, true }, + { SkXfermode::kSrcOver_Mode, 0x50FF00FF, SkPaint::kFill_Style, 0, 20.f, 0, false }, }; LooperSettings compound[] = { - { SkBlendMode::kSrc, SK_ColorWHITE, SkPaint::kStroke_Style, 1.f * 3/4, 0, 0, false }, - { SkBlendMode::kSrc, SK_ColorRED, SkPaint::kStroke_Style, 4.f, 0, 0, false }, - { SkBlendMode::kSrc, SK_ColorBLUE, SkPaint::kFill_Style, 0, 0, 0, false }, - { SkBlendMode::kSrcOver, 0x88000000, SkPaint::kFill_Style, 0, 10.f, 0, true } + { SkXfermode::kSrc_Mode, SK_ColorWHITE, SkPaint::kStroke_Style, 1.f * 3/4, 0, 0, false }, + { SkXfermode::kSrc_Mode, SK_ColorRED, SkPaint::kStroke_Style, 4.f, 0, 0, false }, + { SkXfermode::kSrc_Mode, SK_ColorBLUE, SkPaint::kFill_Style, 0, 0, 0, false }, + { SkXfermode::kSrcOver_Mode, 0x88000000, SkPaint::kFill_Style, 0, 10.f, 0, true } }; LooperSettings xfermode[] = { - { SkBlendMode::kDifference, SK_ColorWHITE, SkPaint::kFill_Style, 0, 0, 0, false }, - { SkBlendMode::kSrcOver, 0xFF000000, SkPaint::kFill_Style, 0, 1.f, 0, true }, - { SkBlendMode::kSrcOver, 0x50FF00FF, SkPaint::kFill_Style, 0, 2.f, 0, false }, + { SkXfermode::kDifference_Mode, SK_ColorWHITE, SkPaint::kFill_Style, 0, 0, 0, false }, + { SkXfermode::kSrcOver_Mode, 0xFF000000, SkPaint::kFill_Style, 0, 1.f, 0, true }, + { SkXfermode::kSrcOver_Mode, 0x50FF00FF, SkPaint::kFill_Style, 0, 2.f, 0, false }, }; // NOTE, this should be ignored by textblobs LooperSettings skew[] = { - { SkBlendMode::kSrc, SK_ColorRED, SkPaint::kFill_Style, 0, 0, -1.f, false }, - { SkBlendMode::kSrc, SK_ColorGREEN, SkPaint::kFill_Style, 0, 10.f, -1.f, false }, - { SkBlendMode::kSrc, SK_ColorBLUE, SkPaint::kFill_Style, 0, 20.f, -1.f, false }, + { SkXfermode::kSrc_Mode, SK_ColorRED, SkPaint::kFill_Style, 0, 0, -1.f, false }, + { SkXfermode::kSrc_Mode, SK_ColorGREEN, SkPaint::kFill_Style, 0, 10.f, -1.f, false }, + { SkXfermode::kSrc_Mode, SK_ColorBLUE, SkPaint::kFill_Style, 0, 20.f, -1.f, false }, }; LooperSettings kitchenSink[] = { - { SkBlendMode::kSrc, SK_ColorWHITE, SkPaint::kStroke_Style, 1.f * 3/4, 0, 0, false }, - { SkBlendMode::kSrc, SK_ColorBLACK, SkPaint::kFill_Style, 0, 0, 0, false }, - { SkBlendMode::kDifference, SK_ColorWHITE, SkPaint::kFill_Style, 1.f, 10.f, 0, false }, - { SkBlendMode::kSrc, SK_ColorWHITE, SkPaint::kFill_Style, 0, 10.f, 0, true }, - { SkBlendMode::kSrcOver, 0x50FF00FF, SkPaint::kFill_Style, 0, 20.f, 0, false }, + { SkXfermode::kSrc_Mode, SK_ColorWHITE, SkPaint::kStroke_Style, 1.f * 3/4, 0, 0, false }, + { SkXfermode::kSrc_Mode, SK_ColorBLACK, SkPaint::kFill_Style, 0, 0, 0, false }, + { SkXfermode::kDifference_Mode, SK_ColorWHITE, SkPaint::kFill_Style, 1.f, 10.f, 0, false }, + { SkXfermode::kSrc_Mode, SK_ColorWHITE, SkPaint::kFill_Style, 0, 10.f, 0, true }, + { SkXfermode::kSrcOver_Mode, 0x50FF00FF, SkPaint::kFill_Style, 0, 20.f, 0, false }, }; fLoopers.push_back(setupLooper(SkLayerDrawLooper::kMaskFilter_Bit | diff --git a/gm/texteffects.cpp b/gm/texteffects.cpp index 453a555..6a5a9c1 100644 --- a/gm/texteffects.cpp +++ b/gm/texteffects.cpp @@ -25,7 +25,7 @@ static void r0(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) { p.setAlpha(0x11); p.setStyle(SkPaint::kFill_Style); - p.setBlendMode(SkBlendMode::kSrc); + p.setXfermodeMode(SkXfermode::kSrc_Mode); rastBuilder->addLayer(p); } @@ -33,7 +33,7 @@ static void r1(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) { rastBuilder->addLayer(p); p.setAlpha(0x40); - p.setBlendMode(SkBlendMode::kSrc); + p.setXfermodeMode(SkXfermode::kSrc_Mode); p.setStyle(SkPaint::kStroke_Style); p.setStrokeWidth(SK_Scalar1*2); rastBuilder->addLayer(p); @@ -46,7 +46,7 @@ static void r2(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) { p.setStyle(SkPaint::kStroke_Style); p.setStrokeWidth(SK_Scalar1*3/2); - p.setBlendMode(SkBlendMode::kClear); + p.setXfermodeMode(SkXfermode::kClear_Mode); rastBuilder->addLayer(p); } @@ -57,7 +57,7 @@ static void r3(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) { p.setAlpha(0x20); p.setStyle(SkPaint::kFill_Style); - p.setBlendMode(SkBlendMode::kSrc); + p.setXfermodeMode(SkXfermode::kSrc_Mode); rastBuilder->addLayer(p); } @@ -66,10 +66,10 @@ static void r4(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) { rastBuilder->addLayer(p, SkIntToScalar(3), SkIntToScalar(3)); p.setAlpha(0xFF); - p.setBlendMode(SkBlendMode::kClear); + p.setXfermodeMode(SkXfermode::kClear_Mode); rastBuilder->addLayer(p, SK_Scalar1*3/2, SK_Scalar1*3/2); - p.setBlendMode(SkBlendMode::kSrcOver); + p.setXfermode(nullptr); rastBuilder->addLayer(p); } @@ -79,7 +79,7 @@ static void r5(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) { rastBuilder->addLayer(p); p.setPathEffect(SkDiscretePathEffect::Make(SK_Scalar1*4, SK_Scalar1*3)); - p.setBlendMode(SkBlendMode::kSrcOut); + p.setXfermodeMode(SkXfermode::kSrcOut_Mode); rastBuilder->addLayer(p); } @@ -90,7 +90,7 @@ static void r6(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) { SkLayerRasterizer::Builder rastBuilder2; r5(&rastBuilder2, p); p.setRasterizer(rastBuilder2.detach()); - p.setBlendMode(SkBlendMode::kClear); + p.setXfermodeMode(SkXfermode::kClear_Mode); rastBuilder->addLayer(p); } @@ -117,11 +117,11 @@ static void r8(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) { lattice.setScale(SK_Scalar1*6, SK_Scalar1*6, 0, 0); lattice.postSkew(SK_Scalar1/3, 0, 0, 0); p.setPathEffect(MakeDotEffect(SK_Scalar1*2, lattice)); - p.setBlendMode(SkBlendMode::kClear); + p.setXfermodeMode(SkXfermode::kClear_Mode); rastBuilder->addLayer(p); p.setPathEffect(nullptr); - p.setBlendMode(SkBlendMode::kSrcOver); + p.setXfermode(nullptr); p.setStyle(SkPaint::kStroke_Style); p.setStrokeWidth(SK_Scalar1); rastBuilder->addLayer(p); @@ -134,11 +134,11 @@ static void r9(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) { lattice.setScale(SK_Scalar1, SK_Scalar1*6, 0, 0); lattice.postRotate(SkIntToScalar(30), 0, 0); p.setPathEffect(SkLine2DPathEffect::Make(SK_Scalar1*2, lattice)); - p.setBlendMode(SkBlendMode::kClear); + p.setXfermodeMode(SkXfermode::kClear_Mode); rastBuilder->addLayer(p); p.setPathEffect(nullptr); - p.setBlendMode(SkBlendMode::kSrcOver); + p.setXfermode(nullptr); p.setStyle(SkPaint::kStroke_Style); p.setStrokeWidth(SK_Scalar1); rastBuilder->addLayer(p); diff --git a/gm/texturedomaineffect.cpp b/gm/texturedomaineffect.cpp index b0d2ece..2dd340e 100644 --- a/gm/texturedomaineffect.cpp +++ b/gm/texturedomaineffect.cpp @@ -57,14 +57,14 @@ protected: SkColor colors2[] = { SK_ColorMAGENTA, SK_ColorLTGRAY, SK_ColorYELLOW }; paint.setShader(SkGradientShader::MakeSweep(45.f, 55.f, colors2, nullptr, SK_ARRAY_COUNT(colors2))); - paint.setBlendMode(SkBlendMode::kDarken); + paint.setXfermodeMode(SkXfermode::kDarken_Mode); canvas.drawOval(SkRect::MakeXYWH(-5.f, -5.f, fBmp.width() + 10.f, fBmp.height() + 10.f), paint); SkColor colors3[] = { SK_ColorBLUE, SK_ColorLTGRAY, SK_ColorGREEN }; paint.setShader(SkGradientShader::MakeSweep(25.f, 35.f, colors3, nullptr, SK_ARRAY_COUNT(colors3))); - paint.setBlendMode(SkBlendMode::kLighten); + paint.setXfermodeMode(SkXfermode::kLighten_Mode); canvas.drawOval(SkRect::MakeXYWH(-5.f, -5.f, fBmp.width() + 10.f, fBmp.height() + 10.f), paint); } diff --git a/gm/verylargebitmap.cpp b/gm/verylargebitmap.cpp index 9f1c05f..f257bf9 100644 --- a/gm/verylargebitmap.cpp +++ b/gm/verylargebitmap.cpp @@ -18,7 +18,7 @@ static void draw(SkCanvas* canvas, int width, int height, SkColor colors[2]) { SkPaint paint; paint.setShader(SkGradientShader::MakeRadial(center, radius, colors, nullptr, 2, SkShader::kMirror_TileMode)); - paint.setBlendMode(SkBlendMode::kSrc); + paint.setXfermodeMode(SkXfermode::kSrc_Mode); canvas->drawPaint(paint); } diff --git a/gm/xfermodeimagefilter.cpp b/gm/xfermodeimagefilter.cpp index 9190859..a0677c7 100644 --- a/gm/xfermodeimagefilter.cpp +++ b/gm/xfermodeimagefilter.cpp @@ -48,45 +48,46 @@ protected: SkPaint paint; const struct { - SkBlendMode fMode; - const char* fLabel; + SkXfermode::Mode fMode; + const char* fLabel; } gModes[] = { - { SkBlendMode::kClear, "Clear" }, - { SkBlendMode::kSrc, "Src" }, - { SkBlendMode::kDst, "Dst" }, - { SkBlendMode::kSrcOver, "SrcOver" }, - { SkBlendMode::kDstOver, "DstOver" }, - { SkBlendMode::kSrcIn, "SrcIn" }, - { SkBlendMode::kDstIn, "DstIn" }, - { SkBlendMode::kSrcOut, "SrcOut" }, - { SkBlendMode::kDstOut, "DstOut" }, - { SkBlendMode::kSrcATop, "SrcATop" }, - { SkBlendMode::kDstATop, "DstATop" }, - { SkBlendMode::kXor, "Xor" }, - - { SkBlendMode::kPlus, "Plus" }, - { SkBlendMode::kModulate, "Modulate" }, - { SkBlendMode::kScreen, "Screen" }, - { SkBlendMode::kOverlay, "Overlay" }, - { SkBlendMode::kDarken, "Darken" }, - { SkBlendMode::kLighten, "Lighten" }, - { SkBlendMode::kColorDodge, "ColorDodge" }, - { SkBlendMode::kColorBurn, "ColorBurn" }, - { SkBlendMode::kHardLight, "HardLight" }, - { SkBlendMode::kSoftLight, "SoftLight" }, - { SkBlendMode::kDifference, "Difference" }, - { SkBlendMode::kExclusion, "Exclusion" }, - { SkBlendMode::kMultiply, "Multiply" }, - { SkBlendMode::kHue, "Hue" }, - { SkBlendMode::kSaturation, "Saturation" }, - { SkBlendMode::kColor, "Color" }, - { SkBlendMode::kLuminosity, "Luminosity" }, + { SkXfermode::kClear_Mode, "Clear" }, + { SkXfermode::kSrc_Mode, "Src" }, + { SkXfermode::kDst_Mode, "Dst" }, + { SkXfermode::kSrcOver_Mode, "SrcOver" }, + { SkXfermode::kDstOver_Mode, "DstOver" }, + { SkXfermode::kSrcIn_Mode, "SrcIn" }, + { SkXfermode::kDstIn_Mode, "DstIn" }, + { SkXfermode::kSrcOut_Mode, "SrcOut" }, + { SkXfermode::kDstOut_Mode, "DstOut" }, + { SkXfermode::kSrcATop_Mode, "SrcATop" }, + { SkXfermode::kDstATop_Mode, "DstATop" }, + { SkXfermode::kXor_Mode, "Xor" }, + + { SkXfermode::kPlus_Mode, "Plus" }, + { SkXfermode::kModulate_Mode, "Modulate" }, + { SkXfermode::kScreen_Mode, "Screen" }, + { SkXfermode::kOverlay_Mode, "Overlay" }, + { SkXfermode::kDarken_Mode, "Darken" }, + { SkXfermode::kLighten_Mode, "Lighten" }, + { SkXfermode::kColorDodge_Mode, "ColorDodge" }, + { SkXfermode::kColorBurn_Mode, "ColorBurn" }, + { SkXfermode::kHardLight_Mode, "HardLight" }, + { SkXfermode::kSoftLight_Mode, "SoftLight" }, + { SkXfermode::kDifference_Mode, "Difference" }, + { SkXfermode::kExclusion_Mode, "Exclusion" }, + { SkXfermode::kMultiply_Mode, "Multiply" }, + { SkXfermode::kHue_Mode, "Hue" }, + { SkXfermode::kSaturation_Mode, "Saturation" }, + { SkXfermode::kColor_Mode, "Color" }, + { SkXfermode::kLuminosity_Mode, "Luminosity" }, }; int x = 0, y = 0; sk_sp background(SkImageSource::Make(fCheckerboard)); for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) { - paint.setImageFilter(SkXfermodeImageFilter::Make(gModes[i].fMode, background)); + paint.setImageFilter(SkXfermodeImageFilter::Make(SkXfermode::Make(gModes[i].fMode), + background)); DrawClippedBitmap(canvas, fBitmap, paint, x, y); x += fBitmap.width() + MARGIN; if (x + fBitmap.width() > WIDTH) { @@ -103,7 +104,7 @@ protected: y += fBitmap.height() + MARGIN; } // Test nullptr mode - paint.setImageFilter(SkXfermodeImageFilter::Make(SkBlendMode::kSrcOver, background)); + paint.setImageFilter(SkXfermodeImageFilter::Make(nullptr, background)); DrawClippedBitmap(canvas, fBitmap, paint, x, y); x += fBitmap.width() + MARGIN; if (x + fBitmap.width() > WIDTH) { @@ -121,10 +122,11 @@ protected: sk_sp offsetBackground(SkOffsetImageFilter::Make(SkIntToScalar(4), SkIntToScalar(4), background)); - paint.setImageFilter(SkXfermodeImageFilter::Make(SkBlendMode::kSrcOver, - offsetBackground, - offsetForeground, - nullptr)); + paint.setImageFilter(SkXfermodeImageFilter::Make( + SkXfermode::Make(SkXfermode::kSrcOver_Mode), + offsetBackground, + offsetForeground, + nullptr)); DrawClippedPaint(canvas, clipRect, paint, x, y); x += fBitmap.width() + MARGIN; if (x + fBitmap.width() > WIDTH) { @@ -132,7 +134,7 @@ protected: y += fBitmap.height() + MARGIN; } // Test offsets on Darken (uses shader blend) - paint.setImageFilter(SkXfermodeImageFilter::Make(SkBlendMode::kDarken, + paint.setImageFilter(SkXfermodeImageFilter::Make(SkXfermode::Make(SkXfermode::kDarken_Mode), offsetBackground, offsetForeground, nullptr)); @@ -144,9 +146,9 @@ protected: } // Test cropping constexpr size_t nbSamples = 3; - const SkBlendMode sampledModes[nbSamples] = { - SkBlendMode::kOverlay, SkBlendMode::kSrcOver, SkBlendMode::kPlus - }; + SkXfermode::Mode sampledModes[nbSamples] = {SkXfermode::kOverlay_Mode, + SkXfermode::kSrcOver_Mode, + SkXfermode::kPlus_Mode}; int offsets[nbSamples][4] = {{ 10, 10, -16, -16}, { 10, 10, 10, 10}, {-10, -10, -6, -6}}; @@ -156,7 +158,7 @@ protected: fBitmap.width() + offsets[i][2], fBitmap.height() + offsets[i][3]); SkImageFilter::CropRect rect(SkRect::Make(cropRect)); - paint.setImageFilter(SkXfermodeImageFilter::Make(sampledModes[i], + paint.setImageFilter(SkXfermodeImageFilter::Make(SkXfermode::Make(sampledModes[i]), offsetBackground, offsetForeground, &rect)); @@ -168,7 +170,7 @@ protected: } } // Test small bg, large fg with Screen (uses shader blend) - SkBlendMode mode = SkBlendMode::kScreen; + auto mode = SkXfermode::Make(SkXfermode::kScreen_Mode); SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(10, 10, 60, 60)); sk_sp cropped(SkOffsetImageFilter::Make(0, 0, foreground, &cropRect)); paint.setImageFilter(SkXfermodeImageFilter::Make(mode, cropped, background, nullptr)); @@ -189,7 +191,7 @@ protected: // Test small fg, large bg with SrcIn with a crop that forces it to full size. // This tests that SkXfermodeImageFilter correctly applies the compositing mode to // the region outside the foreground. - mode = SkBlendMode::kSrcIn; + mode = SkXfermode::Make(SkXfermode::kSrcIn_Mode); SkImageFilter::CropRect cropRectFull(SkRect::MakeXYWH(0, 0, 80, 80)); paint.setImageFilter(SkXfermodeImageFilter::Make(mode, background, cropped, &cropRectFull)); diff --git a/gm/xfermodes.cpp b/gm/xfermodes.cpp index 604a767..8fbbdbe 100644 --- a/gm/xfermodes.cpp +++ b/gm/xfermodes.cpp @@ -34,45 +34,45 @@ enum SrcType { }; const struct { - SkBlendMode fMode; - const char* fLabel; - int fSourceTypeMask; // The source types to use this + SkXfermode::Mode fMode; + const char* fLabel; + int fSourceTypeMask; // The source types to use this // mode with. See draw_mode for // an explanation of each type. // PDF has to play some tricks // to support the base modes, // test those more extensively. } gModes[] = { - { SkBlendMode::kClear, "Clear", kAll_SrcType }, - { SkBlendMode::kSrc, "Src", kAll_SrcType }, - { SkBlendMode::kDst, "Dst", kAll_SrcType }, - { SkBlendMode::kSrcOver, "SrcOver", kAll_SrcType }, - { SkBlendMode::kDstOver, "DstOver", kAll_SrcType }, - { SkBlendMode::kSrcIn, "SrcIn", kAll_SrcType }, - { SkBlendMode::kDstIn, "DstIn", kAll_SrcType }, - { SkBlendMode::kSrcOut, "SrcOut", kAll_SrcType }, - { SkBlendMode::kDstOut, "DstOut", kAll_SrcType }, - { SkBlendMode::kSrcATop, "SrcATop", kAll_SrcType }, - { SkBlendMode::kDstATop, "DstATop", kAll_SrcType }, - - { SkBlendMode::kXor, "Xor", kBasic_SrcType }, - { SkBlendMode::kPlus, "Plus", kBasic_SrcType }, - { SkBlendMode::kModulate, "Modulate", kAll_SrcType }, - { SkBlendMode::kScreen, "Screen", kBasic_SrcType }, - { SkBlendMode::kOverlay, "Overlay", kBasic_SrcType }, - { SkBlendMode::kDarken, "Darken", kBasic_SrcType }, - { SkBlendMode::kLighten, "Lighten", kBasic_SrcType }, - { SkBlendMode::kColorDodge, "ColorDodge", kBasic_SrcType }, - { SkBlendMode::kColorBurn, "ColorBurn", kBasic_SrcType }, - { SkBlendMode::kHardLight, "HardLight", kBasic_SrcType }, - { SkBlendMode::kSoftLight, "SoftLight", kBasic_SrcType }, - { SkBlendMode::kDifference, "Difference", kBasic_SrcType }, - { SkBlendMode::kExclusion, "Exclusion", kBasic_SrcType }, - { SkBlendMode::kMultiply, "Multiply", kAll_SrcType }, - { SkBlendMode::kHue, "Hue", kBasic_SrcType }, - { SkBlendMode::kSaturation, "Saturation", kBasic_SrcType }, - { SkBlendMode::kColor, "Color", kBasic_SrcType }, - { SkBlendMode::kLuminosity, "Luminosity", kBasic_SrcType }, + { SkXfermode::kClear_Mode, "Clear", kAll_SrcType }, + { SkXfermode::kSrc_Mode, "Src", kAll_SrcType }, + { SkXfermode::kDst_Mode, "Dst", kAll_SrcType }, + { SkXfermode::kSrcOver_Mode, "SrcOver", kAll_SrcType }, + { SkXfermode::kDstOver_Mode, "DstOver", kAll_SrcType }, + { SkXfermode::kSrcIn_Mode, "SrcIn", kAll_SrcType }, + { SkXfermode::kDstIn_Mode, "DstIn", kAll_SrcType }, + { SkXfermode::kSrcOut_Mode, "SrcOut", kAll_SrcType }, + { SkXfermode::kDstOut_Mode, "DstOut", kAll_SrcType }, + { SkXfermode::kSrcATop_Mode, "SrcATop", kAll_SrcType }, + { SkXfermode::kDstATop_Mode, "DstATop", kAll_SrcType }, + + { SkXfermode::kXor_Mode, "Xor", kBasic_SrcType }, + { SkXfermode::kPlus_Mode, "Plus", kBasic_SrcType }, + { SkXfermode::kModulate_Mode, "Modulate", kAll_SrcType }, + { SkXfermode::kScreen_Mode, "Screen", kBasic_SrcType }, + { SkXfermode::kOverlay_Mode, "Overlay", kBasic_SrcType }, + { SkXfermode::kDarken_Mode, "Darken", kBasic_SrcType }, + { SkXfermode::kLighten_Mode, "Lighten", kBasic_SrcType }, + { SkXfermode::kColorDodge_Mode, "ColorDodge", kBasic_SrcType }, + { SkXfermode::kColorBurn_Mode, "ColorBurn", kBasic_SrcType }, + { SkXfermode::kHardLight_Mode, "HardLight", kBasic_SrcType }, + { SkXfermode::kSoftLight_Mode, "SoftLight", kBasic_SrcType }, + { SkXfermode::kDifference_Mode, "Difference", kBasic_SrcType }, + { SkXfermode::kExclusion_Mode, "Exclusion", kBasic_SrcType }, + { SkXfermode::kMultiply_Mode, "Multiply", kAll_SrcType }, + { SkXfermode::kHue_Mode, "Hue", kBasic_SrcType }, + { SkXfermode::kSaturation_Mode, "Saturation", kBasic_SrcType }, + { SkXfermode::kColor_Mode, "Color", kBasic_SrcType }, + { SkXfermode::kLuminosity_Mode, "Luminosity", kBasic_SrcType }, }; static void make_bitmaps(int w, int h, SkBitmap* src, SkBitmap* dst, @@ -118,14 +118,15 @@ class XfermodesGM : public skiagm::GM { * uses the implied shape of the drawing command and these modes * demonstrate that. */ - void draw_mode(SkCanvas* canvas, SkBlendMode mode, SrcType srcType, SkScalar x, SkScalar y) { + void draw_mode(SkCanvas* canvas, SkXfermode::Mode mode, SrcType srcType, + SkScalar x, SkScalar y) { SkPaint p; SkMatrix m; bool restoreNeeded = false; m.setTranslate(x, y); canvas->drawBitmap(fSrcB, x, y, &p); - p.setBlendMode(mode); + p.setXfermodeMode(mode); switch (srcType) { case kSmallTransparentImage_SrcType: { m.postScale(SK_ScalarHalf, SK_ScalarHalf, x, y); @@ -140,7 +141,7 @@ class XfermodesGM : public skiagm::GM { SkIntToScalar(H)); canvas->saveLayer(&bounds, &p); restoreNeeded = true; - p.setBlendMode(SkBlendMode::kSrcOver); + p.setXfermodeMode(SkXfermode::kSrcOver_Mode); // Fall through. } case kQuarterClear_SrcType: { diff --git a/gm/xfermodes2.cpp b/gm/xfermodes2.cpp index 03da0d3..6f7d054 100644 --- a/gm/xfermodes2.cpp +++ b/gm/xfermodes2.cpp @@ -40,7 +40,7 @@ protected: SkScalar x = 0, y = 0; for (size_t m = 0; m <= SkXfermode::kLastMode; m++) { - SkBlendMode mode = static_cast(m); + SkXfermode::Mode mode = static_cast(m); canvas->save(); @@ -57,7 +57,7 @@ protected: p.setShader(fDst); canvas->drawRect(r, p); p.setShader(fSrc); - p.setBlendMode(mode); + p.setXfermode(SkXfermode::Make(mode)); canvas->drawRect(r, p); canvas->restore(); @@ -65,7 +65,7 @@ protected: r.inset(-SK_ScalarHalf, -SK_ScalarHalf); p.setStyle(SkPaint::kStroke_Style); p.setShader(nullptr); - p.setBlendMode(SkBlendMode::kSrcOver); + p.setXfermode(nullptr); canvas->drawRect(r, p); canvas->restore(); diff --git a/gm/xfermodes3.cpp b/gm/xfermodes3.cpp index 36702bf..300b78f 100644 --- a/gm/xfermodes3.cpp +++ b/gm/xfermodes3.cpp @@ -69,7 +69,7 @@ protected: }; for (size_t s = 0; s < SK_ARRAY_COUNT(kStrokes); ++s) { for (size_t m = 0; m <= SkXfermode::kLastMode; ++m) { - SkBlendMode mode = static_cast(m); + SkXfermode::Mode mode = static_cast(m); canvas->drawText(SkXfermode::ModeName(mode), strlen(SkXfermode::ModeName(mode)), SkIntToScalar(x), @@ -77,7 +77,7 @@ protected: labelP); for (size_t c = 0; c < SK_ARRAY_COUNT(kSolidColors); ++c) { SkPaint modePaint; - modePaint.setBlendMode(mode); + modePaint.setXfermodeMode(mode); modePaint.setColor(kSolidColors[c]); modePaint.setStyle(kStrokes[s].fStyle); modePaint.setStrokeWidth(kStrokes[s].fWidth); @@ -93,7 +93,7 @@ protected: } for (size_t a = 0; a < SK_ARRAY_COUNT(kBmpAlphas); ++a) { SkPaint modePaint; - modePaint.setBlendMode(mode); + modePaint.setXfermodeMode(mode); modePaint.setAlpha(kBmpAlphas[a]); modePaint.setShader(fBmpShader); modePaint.setStyle(kStrokes[s].fStyle); diff --git a/gyp/skia_for_android_framework_defines.gypi b/gyp/skia_for_android_framework_defines.gypi index 2c24e75..de2f541 100644 --- a/gyp/skia_for_android_framework_defines.gypi +++ b/gyp/skia_for_android_framework_defines.gypi @@ -33,7 +33,6 @@ 'SK_SUPPORT_LEGACY_STREAM_DATA', 'SK_SUPPORT_LEGACY_CLIP_REGIONOPS', 'SK_SUPPORT_LEGACY_SHADER_ISABITMAP', - 'SK_SUPPORT_LEGACY_XFERMODE_OBJECT', ], }, } diff --git a/include/core/SkBlendMode.h b/include/core/SkBlendMode.h deleted file mode 100644 index eb3469f..0000000 --- a/include/core/SkBlendMode.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * 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 SkBlendMode_DEFINED -#define SkBlendMode_DEFINED - -enum class SkBlendMode { - kClear, //!< [0, 0] - kSrc, //!< [Sa, Sc] - kDst, //!< [Da, Dc] - kSrcOver, //!< [Sa + Da * (1 - Sa), Sc + Dc * (1 - Sa)] - kDstOver, //!< [Da + Sa * (1 - Da), Dc + Sc * (1 - Da)] - kSrcIn, //!< [Sa * Da, Sc * Da] - kDstIn, //!< [Da * Sa, Dc * Sa] - kSrcOut, //!< [Sa * (1 - Da), Sc * (1 - Da)] - kDstOut, //!< [Da * (1 - Sa), Dc * (1 - Sa)] - kSrcATop, //!< [Da, Sc * Da + Dc * (1 - Sa)] - kDstATop, //!< [Sa, Dc * Sa + Sc * (1 - Da)] - kXor, //!< [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + Dc * (1 - Sa)] - kPlus, //!< [Sa + Da, Sc + Dc] - kModulate, // multiplies all components (= alpha and color) - - // Following blend modes are defined in the CSS Compositing standard: - // https://dvcs.w3.org/hg/FXTF/rawfile/tip/compositing/index.html#blending - kScreen, - kLastCoeffMode = kScreen, - - kOverlay, - kDarken, - kLighten, - kColorDodge, - kColorBurn, - kHardLight, - kSoftLight, - kDifference, - kExclusion, - kMultiply, - kLastSeparableMode = kMultiply, - - kHue, - kSaturation, - kColor, - kLuminosity, - kLastMode = kLuminosity -}; - -#endif diff --git a/include/core/SkCanvas.h b/include/core/SkCanvas.h index 5078f42..8d98e50 100644 --- a/include/core/SkCanvas.h +++ b/include/core/SkCanvas.h @@ -9,7 +9,6 @@ #define SkCanvas_DEFINED #include "SkTypes.h" -#include "SkBlendMode.h" #include "SkBitmap.h" #include "SkClipOp.h" #include "SkDeque.h" @@ -596,31 +595,22 @@ public: @param b the blue component (0..255) of the color to fill the canvas @param mode the mode to apply the color in (defaults to SrcOver) */ - void drawARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b, SkBlendMode mode = SkBlendMode::kSrcOver); -#ifdef SK_SUPPORT_LEGACY_XFERMODE_OBJECT - void drawARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b, SkXfermode::Mode mode) { - this->drawARGB(a, r, g, b, (SkBlendMode)mode); - } -#endif + void drawARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b, + SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode); /** Fill the entire canvas' bitmap (restricted to the current clip) with the specified color and mode. @param color the color to draw with @param mode the mode to apply the color in (defaults to SrcOver) */ - void drawColor(SkColor color, SkBlendMode mode = SkBlendMode::kSrcOver); -#ifdef SK_SUPPORT_LEGACY_XFERMODE_OBJECT - void drawColor(SkColor color, SkXfermode::Mode mode) { - this->drawColor(color, (SkBlendMode)mode); - } -#endif + void drawColor(SkColor color, SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode); /** * Helper method for drawing a color in SRC mode, completely replacing all the pixels * in the current clip with this color. */ void clear(SkColor color) { - this->drawColor(color, SkBlendMode::kSrc); + this->drawColor(color, SkXfermode::kSrc_Mode); } /** diff --git a/include/core/SkColorFilter.h b/include/core/SkColorFilter.h index 5a23a34..609550f 100644 --- a/include/core/SkColorFilter.h +++ b/include/core/SkColorFilter.h @@ -115,9 +115,6 @@ public: or NULL if the mode will have no effect. */ static sk_sp MakeModeFilter(SkColor c, SkXfermode::Mode mode); - static sk_sp MakeModeFilter(SkColor c, SkBlendMode mode) { - return MakeModeFilter(c, (SkXfermode::Mode)mode); - } /** Construct a colorfilter whose effect is to first apply the inner filter and then apply * the outer filter to the result of the inner's. diff --git a/include/core/SkPaint.h b/include/core/SkPaint.h index ddc90ae..e28d2fc 100644 --- a/include/core/SkPaint.h +++ b/include/core/SkPaint.h @@ -8,14 +8,11 @@ #ifndef SkPaint_DEFINED #define SkPaint_DEFINED -#include "SkBlendMode.h" #include "SkColor.h" #include "SkFilterQuality.h" #include "SkMatrix.h" #include "SkXfermode.h" -//#define SK_SUPPORT_LEGACY_XFERMODE_OBJECT - class SkAutoDescriptor; class SkAutoGlyphCache; class SkColorFilter; @@ -528,13 +525,12 @@ public: #endif void setColorFilter(sk_sp); -#ifdef SK_SUPPORT_LEGACY_XFERMODE_OBJECT /** Get the paint's xfermode object.

The xfermode's reference count is not affected. @return the paint's xfermode (or NULL) */ - SkXfermode* getXfermode() const; + SkXfermode* getXfermode() const { return fXfermode.get(); } /** Set or clear the xfermode object.

@@ -556,11 +552,6 @@ public: the paint's xfermode is set to null. */ SkXfermode* setXfermodeMode(SkXfermode::Mode); -#endif - - SkBlendMode getBlendMode() const { return (SkBlendMode)fBlendMode; } - bool isSrcOver() const { return (SkBlendMode)fBlendMode == SkBlendMode::kSrcOver; } - void setBlendMode(SkBlendMode mode) { fBlendMode = (unsigned)mode; } /** Get the paint's patheffect object.

@@ -1099,6 +1090,7 @@ private: sk_sp fTypeface; sk_sp fPathEffect; sk_sp fShader; + sk_sp fXfermode; sk_sp fMaskFilter; sk_sp fColorFilter; sk_sp fRasterizer; @@ -1111,7 +1103,6 @@ private: SkColor fColor; SkScalar fWidth; SkScalar fMiterLimit; - uint32_t fBlendMode; // just need 5-6 bits for SkXfermode::Mode union { struct { // all of these bitfields should add up to 32 diff --git a/include/core/SkPicture.h b/include/core/SkPicture.h index c2d05f9..c398d3a 100644 --- a/include/core/SkPicture.h +++ b/include/core/SkPicture.h @@ -224,11 +224,10 @@ private: // V47: Add occluder rect to SkBlurMaskFilter // V48: Read and write extended SkTextBlobs. // V49: Gradients serialized as SkColor4f + SkColorSpace - // V50: SkXfermode -> SkBlendMode // Only SKPs within the min/current picture version range (inclusive) can be read. static const uint32_t MIN_PICTURE_VERSION = 35; // Produced by Chrome M39. - static const uint32_t CURRENT_PICTURE_VERSION = 50; + static const uint32_t CURRENT_PICTURE_VERSION = 49; static_assert(MIN_PICTURE_VERSION <= 41, "Remove kFontFileName and related code from SkFontDescriptor.cpp."); diff --git a/include/core/SkXfermode.h b/include/core/SkXfermode.h index 8319ad6..2d12b3c 100644 --- a/include/core/SkXfermode.h +++ b/include/core/SkXfermode.h @@ -8,9 +8,8 @@ #ifndef SkXfermode_DEFINED #define SkXfermode_DEFINED -#include "SkBlendMode.h" -#include "SkColor.h" #include "SkFlattenable.h" +#include "SkColor.h" class GrFragmentProcessor; class GrTexture; @@ -113,9 +112,6 @@ public: * Gets the name of the Mode as a string. */ static const char* ModeName(Mode); - static const char* ModeName(SkBlendMode mode) { - return ModeName(Mode(mode)); - } /** * If the xfermode is one of the modes in the Mode enum, then asMode() @@ -161,31 +157,6 @@ public: } #endif - /** - * Skia maintains global xfermode objects corresponding to each BlendMode. This returns a - * ptr to that global xfermode (or null if the mode is srcover). Thus the caller may use - * the returned ptr, but it should leave its refcnt untouched. - */ - static SkXfermode* Peek(SkBlendMode mode) { - sk_sp xfer = Make(mode); - if (!xfer) { - SkASSERT(SkBlendMode::kSrcOver == mode); - return nullptr; - } - SkASSERT(!xfer->unique()); - return xfer.get(); - } - - static sk_sp Make(SkBlendMode bm) { - return Make((Mode)bm); - } - - SkBlendMode blend() const { - Mode mode; - SkAssertResult(this->asMode(&mode)); - return (SkBlendMode)mode; - } - /** Return a function pointer to a routine that applies the specified porter-duff transfer mode. */ @@ -244,7 +215,6 @@ public: static bool IsOpaque(const sk_sp& xfer, SrcColorOpacity opacityType) { return IsOpaque(xfer.get(), opacityType); } - static bool IsOpaque(SkBlendMode, SrcColorOpacity); #if SK_SUPPORT_GPU /** Used by the SkXfermodeImageFilter to blend two colors via a GrFragmentProcessor. diff --git a/include/effects/SkXfermodeImageFilter.h b/include/effects/SkXfermodeImageFilter.h index fa9c857..6066b8d 100644 --- a/include/effects/SkXfermodeImageFilter.h +++ b/include/effects/SkXfermodeImageFilter.h @@ -8,7 +8,6 @@ #ifndef SkXfermodeImageFilter_DEFINED #define SkXfermodeImageFilter_DEFINED -#include "SkBlendMode.h" #include "SkImageFilter.h" class SkXfermode; @@ -20,11 +19,11 @@ class SkXfermode; */ class SK_API SkXfermodeImageFilter { public: - static sk_sp Make(SkBlendMode, sk_sp background, + static sk_sp Make(sk_sp mode, sk_sp background, sk_sp foreground, const SkImageFilter::CropRect* cropRect); - static sk_sp Make(SkBlendMode mode, sk_sp background) { - return Make(mode, std::move(background), nullptr, nullptr); + static sk_sp Make(sk_sp mode, sk_sp background) { + return Make(std::move(mode), std::move(background), nullptr, nullptr); } static sk_sp MakeArithmetic(float k1, float k2, float k3, float k4, @@ -39,16 +38,6 @@ public: nullptr, nullptr); } -#ifdef SK_SUPPORT_LEGACY_XFERMODE_OBJECT - static sk_sp Make(sk_sp mode, sk_sp background, - sk_sp foreground, - const SkImageFilter::CropRect* cropRect); - static sk_sp Make(sk_sp mode, sk_sp background) { - return Make(std::move(mode), std::move(background), nullptr, nullptr); - } - -#endif - #ifdef SK_SUPPORT_LEGACY_XFERMODE_PTR static SkImageFilter* Create(SkXfermode* mode, SkImageFilter* background, SkImageFilter* foreground = NULL, diff --git a/include/gpu/GrPaint.h b/include/gpu/GrPaint.h index a8af3c2..6120348 100644 --- a/include/gpu/GrPaint.h +++ b/include/gpu/GrPaint.h @@ -16,9 +16,9 @@ #include "effects/GrPorterDuffXferProcessor.h" #include "GrFragmentProcessor.h" -#include "SkBlendMode.h" #include "SkRefCnt.h" #include "SkRegion.h" +#include "SkXfermode.h" /** * The paint describes how color and coverage are computed at each pixel by GrContext draw @@ -95,10 +95,6 @@ public: fXPFactory = std::move(xpFactory); } - void setPorterDuffXPFactory(SkBlendMode mode) { - fXPFactory = GrPorterDuffXPFactory::Make((SkXfermode::Mode)mode); - } - void setPorterDuffXPFactory(SkXfermode::Mode mode) { fXPFactory = GrPorterDuffXPFactory::Make(mode); } diff --git a/include/gpu/effects/GrPorterDuffXferProcessor.h b/include/gpu/effects/GrPorterDuffXferProcessor.h index 6777d76..8399d58 100644 --- a/include/gpu/effects/GrPorterDuffXferProcessor.h +++ b/include/gpu/effects/GrPorterDuffXferProcessor.h @@ -17,9 +17,6 @@ class GrProcOptInfo; class GrPorterDuffXPFactory : public GrXPFactory { public: static sk_sp Make(SkXfermode::Mode mode); - static sk_sp Make(SkBlendMode mode) { - return Make((SkXfermode::Mode)mode); - } void getInvariantBlendedColor(const GrProcOptInfo& colorPOI, GrXPFactory::InvariantBlendedColor*) const override; diff --git a/public.bzl b/public.bzl index 0e7a065..a34f76e 100644 --- a/public.bzl +++ b/public.bzl @@ -618,7 +618,6 @@ DEFINES_ALL = [ "SK_SUPPORT_LEGACY_TEXTBLOB_BUILDER", "SK_SUPPORT_LEGACY_CLIP_REGIONOPS", "SK_SUPPORT_LEGACY_SHADER_ISABITMAP", - "SK_SUPPORT_LEGACY_XFERMODE_OBJECT", ] ################################################################################ diff --git a/samplecode/SampleAARectModes.cpp b/samplecode/SampleAARectModes.cpp index 0a50303..65b1da1 100644 --- a/samplecode/SampleAARectModes.cpp +++ b/samplecode/SampleAARectModes.cpp @@ -12,21 +12,21 @@ #include "SkShader.h" static const struct { - SkBlendMode fMode; - const char* fLabel; + SkXfermode::Mode fMode; + const char* fLabel; } gModes[] = { - { SkBlendMode::kClear, "Clear" }, - { SkBlendMode::kSrc, "Src" }, - { SkBlendMode::kDst, "Dst" }, - { SkBlendMode::kSrcOver, "SrcOver" }, - { SkBlendMode::kDstOver, "DstOver" }, - { SkBlendMode::kSrcIn, "SrcIn" }, - { SkBlendMode::kDstIn, "DstIn" }, - { SkBlendMode::kSrcOut, "SrcOut" }, - { SkBlendMode::kDstOut, "DstOut" }, - { SkBlendMode::kSrcATop, "SrcATop" }, - { SkBlendMode::kDstATop, "DstATop" }, - { SkBlendMode::kXor, "Xor" }, + { SkXfermode::kClear_Mode, "Clear" }, + { SkXfermode::kSrc_Mode, "Src" }, + { SkXfermode::kDst_Mode, "Dst" }, + { SkXfermode::kSrcOver_Mode, "SrcOver" }, + { SkXfermode::kDstOver_Mode, "DstOver" }, + { SkXfermode::kSrcIn_Mode, "SrcIn" }, + { SkXfermode::kDstIn_Mode, "DstIn" }, + { SkXfermode::kSrcOut_Mode, "SrcOut" }, + { SkXfermode::kDstOut_Mode, "DstOut" }, + { SkXfermode::kSrcATop_Mode, "SrcATop" }, + { SkXfermode::kDstATop_Mode, "DstATop" }, + { SkXfermode::kXor_Mode, "Xor" }, }; const int gWidth = 64; @@ -34,7 +34,7 @@ const int gHeight = 64; const SkScalar W = SkIntToScalar(gWidth); const SkScalar H = SkIntToScalar(gHeight); -static SkScalar drawCell(SkCanvas* canvas, SkBlendMode mode, SkAlpha a0, SkAlpha a1) { +static SkScalar drawCell(SkCanvas* canvas, const sk_sp& mode, SkAlpha a0, SkAlpha a1) { SkPaint paint; paint.setAntiAlias(true); @@ -47,7 +47,7 @@ static SkScalar drawCell(SkCanvas* canvas, SkBlendMode mode, SkAlpha a0, SkAlpha paint.setColor(SK_ColorRED); paint.setAlpha(a1); - paint.setBlendMode(mode); + paint.setXfermode(mode); SkScalar offset = SK_Scalar1 / 3; SkRect rect = SkRect::MakeXYWH(W / 4 + offset, @@ -106,10 +106,11 @@ protected: canvas->translate(W * 5, 0); canvas->save(); } + sk_sp mode = SkXfermode::Make(gModes[i].fMode); canvas->drawRect(bounds, fBGPaint); canvas->saveLayer(&bounds, nullptr); - SkScalar dy = drawCell(canvas, gModes[i].fMode, gAlphaValue[alpha & 1], + SkScalar dy = drawCell(canvas, mode, gAlphaValue[alpha & 1], gAlphaValue[alpha & 2]); canvas->restore(); diff --git a/samplecode/SampleAll.cpp b/samplecode/SampleAll.cpp index 8c1ace5..29b5c66 100644 --- a/samplecode/SampleAll.cpp +++ b/samplecode/SampleAll.cpp @@ -89,7 +89,7 @@ static void r0(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) { p.setAlpha(0x11); p.setStyle(SkPaint::kFill_Style); - p.setBlendMode(SkBlendMode::kSrc); + p.setXfermodeMode(SkXfermode::kSrc_Mode); rastBuilder->addLayer(p); } @@ -97,7 +97,7 @@ static void r1(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) { rastBuilder->addLayer(p); p.setAlpha(0x40); - p.setBlendMode(SkBlendMode::kSrc); + p.setXfermodeMode(SkXfermode::kSrc_Mode); p.setStyle(SkPaint::kStroke_Style); p.setStrokeWidth(SK_Scalar1*2); rastBuilder->addLayer(p); @@ -110,7 +110,7 @@ static void r2(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) { p.setStyle(SkPaint::kStroke_Style); p.setStrokeWidth(SK_Scalar1*3/2); - p.setBlendMode(SkBlendMode::kClear); + p.setXfermodeMode(SkXfermode::kClear_Mode); rastBuilder->addLayer(p); } @@ -121,7 +121,7 @@ static void r3(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) { p.setAlpha(0x20); p.setStyle(SkPaint::kFill_Style); - p.setBlendMode(SkBlendMode::kSrc); + p.setXfermodeMode(SkXfermode::kSrc_Mode); rastBuilder->addLayer(p); } @@ -130,10 +130,10 @@ static void r4(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) { rastBuilder->addLayer(p, SkIntToScalar(3), SkIntToScalar(3)); p.setAlpha(0xFF); - p.setBlendMode(SkBlendMode::kClear); + p.setXfermodeMode(SkXfermode::kClear_Mode); rastBuilder->addLayer(p, SK_Scalar1*3/2, SK_Scalar1*3/2); - p.setBlendMode(SkBlendMode::kSrcOver); + p.setXfermode(nullptr); rastBuilder->addLayer(p); } @@ -141,7 +141,7 @@ static void r5(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) { rastBuilder->addLayer(p); p.setPathEffect(SkDiscretePathEffect::Make(SK_Scalar1*4, SK_Scalar1*3)); - p.setBlendMode(SkBlendMode::kSrcOut); + p.setXfermodeMode(SkXfermode::kSrcOut_Mode); rastBuilder->addLayer(p); } @@ -152,7 +152,7 @@ static void r6(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) { SkLayerRasterizer::Builder rastBuilder2; r5(&rastBuilder2, p); p.setRasterizer(rastBuilder2.detach()); - p.setBlendMode(SkBlendMode::kClear); + p.setXfermodeMode(SkXfermode::kClear_Mode); rastBuilder->addLayer(p); } @@ -194,11 +194,11 @@ static void r8(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) { lattice.setScale(SK_Scalar1*6, SK_Scalar1*6, 0, 0); lattice.postSkew(SK_Scalar1/3, 0, 0, 0); p.setPathEffect(sk_make_sp(SK_Scalar1*2, lattice)); - p.setBlendMode(SkBlendMode::kClear); + p.setXfermodeMode(SkXfermode::kClear_Mode); rastBuilder->addLayer(p); p.setPathEffect(nullptr); - p.setBlendMode(SkBlendMode::kSrcOver); + p.setXfermode(nullptr); p.setStyle(SkPaint::kStroke_Style); p.setStrokeWidth(SK_Scalar1); rastBuilder->addLayer(p); @@ -211,11 +211,11 @@ static void r9(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) { lattice.setScale(SK_Scalar1, SK_Scalar1*6, 0, 0); lattice.postRotate(SkIntToScalar(30), 0, 0); p.setPathEffect(SkLine2DPathEffect::Make(SK_Scalar1*2, lattice)); - p.setBlendMode(SkBlendMode::kClear); + p.setXfermodeMode(SkXfermode::kClear_Mode); rastBuilder->addLayer(p); p.setPathEffect(nullptr); - p.setBlendMode(SkBlendMode::kSrcOver); + p.setXfermode(nullptr); p.setStyle(SkPaint::kStroke_Style); p.setStrokeWidth(SK_Scalar1); rastBuilder->addLayer(p); @@ -401,10 +401,10 @@ protected: paint.setColor(SK_ColorGREEN); paint.setStrokeWidth(SkIntToScalar(10)); paint.setStyle(SkPaint::kStroke_Style); - paint.setBlendMode(SkBlendMode::kXor); + paint.setXfermode(SkXfermode::Make(SkXfermode::kXor_Mode)); paint.setColorFilter(lightingFilter); canvas->drawLine(start.fX, start.fY, stop.fX, stop.fY, paint); // should not be green - paint.setBlendMode(SkBlendMode::kSrcOver); + paint.setXfermode(nullptr); paint.setColorFilter(nullptr); // rectangle diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp index d2374f5..233306c 100644 --- a/samplecode/SampleApp.cpp +++ b/samplecode/SampleApp.cpp @@ -351,7 +351,7 @@ public: bool doGamma = (fActualColorBits == 30) && SkImageInfoIsGammaCorrect(win->info()); SkPaint gammaPaint; - gammaPaint.setBlendMode(SkBlendMode::kSrc); + gammaPaint.setXfermodeMode(SkXfermode::kSrc_Mode); if (doGamma) { gammaPaint.setColorFilter(SkGammaColorFilter::Make(1.0f / 2.2f)); } diff --git a/samplecode/SampleColorFilter.cpp b/samplecode/SampleColorFilter.cpp index 67c7b2e..3da77a4 100644 --- a/samplecode/SampleColorFilter.cpp +++ b/samplecode/SampleColorFilter.cpp @@ -100,7 +100,7 @@ static SkBitmap createBitmap(int n) { canvas.drawOval(r, paint); r.inset(SK_Scalar1*n/4, SK_Scalar1*n/4); - paint.setBlendMode(SkBlendMode::kSrc); + paint.setXfermodeMode(SkXfermode::kSrc_Mode); paint.setColor(0x800000FF); canvas.drawOval(r, paint); diff --git a/samplecode/SampleFatBits.cpp b/samplecode/SampleFatBits.cpp index 82eb25f..8da6058 100644 --- a/samplecode/SampleFatBits.cpp +++ b/samplecode/SampleFatBits.cpp @@ -163,7 +163,7 @@ private: canvas->restore(); SkPaint paint; - paint.setBlendMode(SkBlendMode::kClear); + paint.setXfermodeMode(SkXfermode::kClear_Mode); for (int iy = 1; iy < fH; ++iy) { SkScalar y = SkIntToScalar(iy * fZoom); canvas->drawLine(0, y - SK_ScalarHalf, 999, y - SK_ScalarHalf, paint); diff --git a/samplecode/SampleFilterFuzz.cpp b/samplecode/SampleFilterFuzz.cpp index 28aa5f4..755e8fb 100644 --- a/samplecode/SampleFilterFuzz.cpp +++ b/samplecode/SampleFilterFuzz.cpp @@ -157,8 +157,8 @@ static SkMatrix make_matrix() { return m; } -static SkBlendMode make_xfermode() { - return static_cast(R(SkXfermode::kLastMode+1)); +static SkXfermode::Mode make_xfermode() { + return static_cast(R(SkXfermode::kLastMode+1)); } static SkPaint::Align make_paint_align() { @@ -508,7 +508,7 @@ static SkPaint make_paint() { paint.setStrokeCap(make_paint_cap()); paint.setStrokeJoin(make_paint_join()); paint.setColorFilter(make_color_filter()); - paint.setBlendMode(make_xfermode()); + paint.setXfermodeMode(make_xfermode()); paint.setPathEffect(make_path_effect()); paint.setMaskFilter(make_mask_filter()); @@ -558,7 +558,7 @@ static sk_sp make_image_filter(bool canBeNull) { case MERGE: filter = SkMergeImageFilter::Make(make_image_filter(), make_image_filter(), - (SkXfermode::Mode)make_xfermode()); + make_xfermode()); break; case COLOR: { sk_sp cf(make_color_filter()); @@ -585,7 +585,7 @@ static sk_sp make_image_filter(bool canBeNull) { make_image_filter()); break; case XFERMODE: - filter = SkXfermodeImageFilter::Make(make_xfermode(), + filter = SkXfermodeImageFilter::Make(SkXfermode::Make(make_xfermode()), make_image_filter(), make_image_filter(), nullptr); diff --git a/samplecode/SampleFuzz.cpp b/samplecode/SampleFuzz.cpp index c7d0578..76420f0 100644 --- a/samplecode/SampleFuzz.cpp +++ b/samplecode/SampleFuzz.cpp @@ -153,15 +153,15 @@ static void do_fuzz(SkCanvas* canvas) { break; case 2: { - SkBlendMode mode; + SkXfermode::Mode mode; switch (R(3)) { - case 0: mode = SkBlendMode::kSrc; break; - case 1: mode = SkBlendMode::kXor; break; + case 0: mode = SkXfermode::kSrc_Mode; break; + case 1: mode = SkXfermode::kXor_Mode; break; case 2: default: // silence warning - mode = SkBlendMode::kSrcOver; break; + mode = SkXfermode::kSrcOver_Mode; break; } - paint.setBlendMode(mode); + paint.setXfermodeMode(mode); } break; diff --git a/samplecode/SampleHairModes.cpp b/samplecode/SampleHairModes.cpp index 5eeb6cb..26037d7 100644 --- a/samplecode/SampleHairModes.cpp +++ b/samplecode/SampleHairModes.cpp @@ -12,21 +12,21 @@ #include "SkShader.h" static const struct { - SkBlendMode fMode; - const char* fLabel; + SkXfermode::Mode fMode; + const char* fLabel; } gModes[] = { - { SkBlendMode::kClear, "Clear" }, - { SkBlendMode::kSrc, "Src" }, - { SkBlendMode::kDst, "Dst" }, - { SkBlendMode::kSrcOver, "SrcOver" }, - { SkBlendMode::kDstOver, "DstOver" }, - { SkBlendMode::kSrcIn, "SrcIn" }, - { SkBlendMode::kDstIn, "DstIn" }, - { SkBlendMode::kSrcOut, "SrcOut" }, - { SkBlendMode::kDstOut, "DstOut" }, - { SkBlendMode::kSrcATop, "SrcATop" }, - { SkBlendMode::kDstATop, "DstATop" }, - { SkBlendMode::kXor, "Xor" }, + { SkXfermode::kClear_Mode, "Clear" }, + { SkXfermode::kSrc_Mode, "Src" }, + { SkXfermode::kDst_Mode, "Dst" }, + { SkXfermode::kSrcOver_Mode, "SrcOver" }, + { SkXfermode::kDstOver_Mode, "DstOver" }, + { SkXfermode::kSrcIn_Mode, "SrcIn" }, + { SkXfermode::kDstIn_Mode, "DstIn" }, + { SkXfermode::kSrcOut_Mode, "SrcOut" }, + { SkXfermode::kDstOut_Mode, "DstOut" }, + { SkXfermode::kSrcATop_Mode, "SrcATop" }, + { SkXfermode::kDstATop_Mode, "DstATop" }, + { SkXfermode::kXor_Mode, "Xor" }, }; const int gWidth = 64; @@ -34,7 +34,7 @@ const int gHeight = 64; const SkScalar W = SkIntToScalar(gWidth); const SkScalar H = SkIntToScalar(gHeight); -static SkScalar drawCell(SkCanvas* canvas, SkBlendMode mode, SkAlpha a0, SkAlpha a1) { +static SkScalar drawCell(SkCanvas* canvas, sk_sp mode, SkAlpha a0, SkAlpha a1) { SkPaint paint; paint.setAntiAlias(true); @@ -47,7 +47,7 @@ static SkScalar drawCell(SkCanvas* canvas, SkBlendMode mode, SkAlpha a0, SkAlpha paint.setColor(SK_ColorRED); paint.setAlpha(a1); - paint.setBlendMode(mode); + paint.setXfermode(mode); for (int angle = 0; angle < 24; ++angle) { SkScalar x = SkScalarCos(SkIntToScalar(angle) * (SK_ScalarPI * 2) / 24) * gWidth; SkScalar y = SkScalarSin(SkIntToScalar(angle) * (SK_ScalarPI * 2) / 24) * gHeight; @@ -105,7 +105,7 @@ protected: } canvas->drawRect(bounds, fBGPaint); canvas->saveLayer(&bounds, nullptr); - SkScalar dy = drawCell(canvas, gModes[i].fMode, + SkScalar dy = drawCell(canvas, SkXfermode::Make(gModes[i].fMode), gAlphaValue[alpha & 1], gAlphaValue[alpha & 2]); canvas->restore(); diff --git a/samplecode/SampleLayerMask.cpp b/samplecode/SampleLayerMask.cpp index f0c6a40..5fce85c 100644 --- a/samplecode/SampleLayerMask.cpp +++ b/samplecode/SampleLayerMask.cpp @@ -44,13 +44,13 @@ protected: bounds.offset(-bounds.fLeft, -bounds.fTop); c.drawOval(bounds, paint); - paint.setBlendMode(SkBlendMode::kDstIn); + paint.setXfermodeMode(SkXfermode::kDstIn_Mode); canvas->drawBitmap(mask, r.fLeft, r.fTop, &paint); } else { SkPath p; p.addOval(r); p.setFillType(SkPath::kInverseWinding_FillType); - paint.setBlendMode(SkBlendMode::kDstOut); + paint.setXfermodeMode(SkXfermode::kDstOut_Mode); canvas->drawPath(p, paint); } } diff --git a/samplecode/SampleLayers.cpp b/samplecode/SampleLayers.cpp index 71b2e8b..52e6593 100644 --- a/samplecode/SampleLayers.cpp +++ b/samplecode/SampleLayers.cpp @@ -31,7 +31,7 @@ static void make_paint(SkPaint* paint, const SkMatrix& localMatrix) { SkPoint pts[] = { { 0, 0 }, { 0, SK_Scalar1*20 } }; paint->setShader(SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode, 0, &localMatrix)); - paint->setBlendMode(SkBlendMode::kDstIn); + paint->setXfermodeMode(SkXfermode::kDstIn_Mode); } // test drawing with strips of fading gradient above and below @@ -141,7 +141,7 @@ protected: canvas->saveLayer(&r, &p); canvas->drawColor(0xFFFF0000); p.setAlpha(0); // or 0 - p.setBlendMode(SkBlendMode::kSrc); + p.setXfermodeMode(SkXfermode::kSrc_Mode); canvas->drawOval(r, p); canvas->restore(); return; diff --git a/samplecode/SamplePathClip.cpp b/samplecode/SamplePathClip.cpp index af9608f..a53fe71 100644 --- a/samplecode/SamplePathClip.cpp +++ b/samplecode/SamplePathClip.cpp @@ -225,7 +225,7 @@ protected: // We use a layer, so we can PLUS the different edge-colors, showing where two edges // canceled each other out. canvas->saveLayer(nullptr, nullptr); - p.setBlendMode(SkBlendMode::kPlus); + p.setXfermodeMode(SkXfermode::kPlus_Mode); for (int i = 0; i < N; ++i) { const int j = (i + 1) % N; p.setColor(fEdgeColor[i]); diff --git a/samplecode/SampleQuadStroker.cpp b/samplecode/SampleQuadStroker.cpp index 30b8603..ab65ff6 100644 --- a/samplecode/SampleQuadStroker.cpp +++ b/samplecode/SampleQuadStroker.cpp @@ -248,7 +248,7 @@ protected: canvas->restore(); SkPaint paint; - paint.setBlendMode(SkBlendMode::kClear); + paint.setXfermodeMode(SkXfermode::kClear_Mode); for (int iy = 1; iy < fH; ++iy) { SkScalar y = SkIntToScalar(iy * fZoom); canvas->drawLine(0, y - SK_ScalarHalf, 999, y - SK_ScalarHalf, paint); diff --git a/samplecode/SampleRegion.cpp b/samplecode/SampleRegion.cpp index 082ff22..1934dc7 100644 --- a/samplecode/SampleRegion.cpp +++ b/samplecode/SampleRegion.cpp @@ -80,7 +80,7 @@ static void drawFadingText(SkCanvas* canvas, SkPaint p; p.setShader(SkGradientShader::MakeLinear(pts, colors, pos, 3, SkShader::kClamp_TileMode)); - p.setBlendMode(SkBlendMode::kDstIn); + p.setXfermodeMode(SkXfermode::kDstIn_Mode); canvas->drawRect(bounds, p); canvas->restore(); diff --git a/samplecode/SampleSlides.cpp b/samplecode/SampleSlides.cpp index 521e9f6..5858d26 100644 --- a/samplecode/SampleSlides.cpp +++ b/samplecode/SampleSlides.cpp @@ -472,7 +472,7 @@ static void r0(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) p.setAlpha(0x11); p.setStyle(SkPaint::kFill_Style); - p.setBlendMode(SkBlendMode::kSrc); + p.setXfermodeMode(SkXfermode::kSrc_Mode); rastBuilder->addLayer(p); } @@ -481,7 +481,7 @@ static void r1(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) rastBuilder->addLayer(p); p.setAlpha(0x40); - p.setBlendMode(SkBlendMode::kSrc); + p.setXfermodeMode(SkXfermode::kSrc_Mode); p.setStyle(SkPaint::kStroke_Style); p.setStrokeWidth(SK_Scalar1*2); rastBuilder->addLayer(p); @@ -495,7 +495,7 @@ static void r2(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) p.setStyle(SkPaint::kStroke_Style); p.setStrokeWidth(SK_Scalar1*3/2); - p.setBlendMode(SkBlendMode::kClear); + p.setXfermodeMode(SkXfermode::kClear_Mode); rastBuilder->addLayer(p); } @@ -507,7 +507,7 @@ static void r3(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) p.setAlpha(0x20); p.setStyle(SkPaint::kFill_Style); - p.setBlendMode(SkBlendMode::kSrc); + p.setXfermodeMode(SkXfermode::kSrc_Mode); rastBuilder->addLayer(p); } @@ -517,10 +517,10 @@ static void r4(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) rastBuilder->addLayer(p, SkIntToScalar(3), SkIntToScalar(3)); p.setAlpha(0xFF); - p.setBlendMode(SkBlendMode::kClear); + p.setXfermodeMode(SkXfermode::kClear_Mode); rastBuilder->addLayer(p, SK_Scalar1*3/2, SK_Scalar1*3/2); - p.setBlendMode(SkBlendMode::kSrcOver); + p.setXfermode(nullptr); rastBuilder->addLayer(p); } @@ -531,7 +531,7 @@ static void r5(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) rastBuilder->addLayer(p); p.setPathEffect(SkDiscretePathEffect::Make(SK_Scalar1*4, SK_Scalar1*3)); - p.setBlendMode(SkBlendMode::kSrcOut); + p.setXfermodeMode(SkXfermode::kSrcOut_Mode); rastBuilder->addLayer(p); } @@ -543,7 +543,7 @@ static void r6(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) SkLayerRasterizer::Builder rastBuilder2; r5(&rastBuilder2, p); p.setRasterizer(rastBuilder2.detach()); - p.setBlendMode(SkBlendMode::kClear); + p.setXfermodeMode(SkXfermode::kClear_Mode); rastBuilder->addLayer(p); } @@ -572,11 +572,11 @@ static void r8(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) lattice.setScale(SK_Scalar1*6, SK_Scalar1*6, 0, 0); lattice.postSkew(SK_Scalar1/3, 0, 0, 0); p.setPathEffect(MakeDotEffect(SK_Scalar1*2, lattice)); - p.setBlendMode(SkBlendMode::kClear); + p.setXfermodeMode(SkXfermode::kClear_Mode); rastBuilder->addLayer(p); p.setPathEffect(nullptr); - p.setBlendMode(SkBlendMode::kSrcOver); + p.setXfermode(nullptr); p.setStyle(SkPaint::kStroke_Style); p.setStrokeWidth(SK_Scalar1); rastBuilder->addLayer(p); @@ -590,11 +590,11 @@ static void r9(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) lattice.setScale(SK_Scalar1, SK_Scalar1*6, 0, 0); lattice.postRotate(SkIntToScalar(30), 0, 0); p.setPathEffect(SkLine2DPathEffect::Make(SK_Scalar1*2, lattice)); - p.setBlendMode(SkBlendMode::kClear); + p.setXfermodeMode(SkXfermode::kClear_Mode); rastBuilder->addLayer(p); p.setPathEffect(nullptr); - p.setBlendMode(SkBlendMode::kSrcOver); + p.setXfermode(nullptr); p.setStyle(SkPaint::kStroke_Style); p.setStrokeWidth(SK_Scalar1); rastBuilder->addLayer(p); diff --git a/samplecode/SampleXfer.cpp b/samplecode/SampleXfer.cpp index c0ad000..6aaffe5 100644 --- a/samplecode/SampleXfer.cpp +++ b/samplecode/SampleXfer.cpp @@ -18,18 +18,18 @@ #include "SkGradientShader.h" const struct { - SkBlendMode fMode; - const char* fName; + SkXfermode::Mode fMode; + const char* fName; } gModes[] = { - { SkBlendMode::kSrcOver, "src-over" }, - { SkBlendMode::kSrc, "src" }, - { SkBlendMode::kSrcIn, "src-in" }, - { SkBlendMode::kSrcOut, "src-out" }, - { SkBlendMode::kSrcATop, "src-atop" }, - { SkBlendMode::kDstOver, "dst-over" }, - { SkBlendMode::kDstIn, "dst-in" }, - { SkBlendMode::kDstOut, "dst-out" }, - { SkBlendMode::kDstATop, "dst-atop" }, + { SkXfermode::kSrcOver_Mode, "src-over" }, + { SkXfermode::kSrc_Mode, "src" }, + { SkXfermode::kSrcIn_Mode, "src-in" }, + { SkXfermode::kSrcOut_Mode, "src-out" }, + { SkXfermode::kSrcATop_Mode, "src-atop" }, + { SkXfermode::kDstOver_Mode, "dst-over" }, + { SkXfermode::kDstIn_Mode, "dst-in" }, + { SkXfermode::kDstOut_Mode, "dst-out" }, + { SkXfermode::kDstATop_Mode, "dst-atop" }, }; const int N_Modes = SK_ARRAY_COUNT(gModes); @@ -109,10 +109,10 @@ private: class ModeDrawable : public SkDrawable { public: - ModeDrawable() : fMode(SkBlendMode::kSrcOver), fLoc(SkPoint::Make(0, 0)) {} + ModeDrawable() : fMode(SkXfermode::kSrcOver_Mode), fLoc(SkPoint::Make(0, 0)) {} - SkBlendMode fMode; - SkPoint fLoc; + SkXfermode::Mode fMode; + SkPoint fLoc; bool hitTest(SkScalar x, SkScalar y) { SkRect target = SkRect::MakeXYWH(x - fLoc.x() - 1, y - fLoc.y() - 1, 3, 3); @@ -139,7 +139,7 @@ protected: } void onDraw(SkCanvas* canvas) override { - fPaint.setBlendMode(fMode); + fPaint.setXfermodeMode(fMode); canvas->save(); canvas->translate(fLoc.x(), fLoc.y()); canvas->drawOval(fBounds, fPaint); @@ -160,7 +160,7 @@ class XferDemo : public SampleView { SkScalar x = 10; SkScalar y = 10; for (int i = 0; i < N_Modes; ++i) { - SkAutoTUnref v(new PushButtonWig(gModes[i].fName, (int)gModes[i].fMode)); + SkAutoTUnref v(new PushButtonWig(gModes[i].fName, gModes[i].fMode)); v->setSize(70, 25); v->setLoc(x, y); v->setVisibleP(true); @@ -178,7 +178,7 @@ public: for (int i = 0; i < N; ++i) { fDrs[i].reset(new CircDrawable(200, colors[i])); fDrs[i]->fLoc.set(100.f + i * 100, 100.f + i * 100); - fDrs[i]->fMode = SkBlendMode::kSrcOver; + fDrs[i]->fMode = SkXfermode::kSrcOver_Mode; } fSelected = nullptr; @@ -189,7 +189,7 @@ protected: bool onEvent(const SkEvent& evt) override { if (evt.isType("push-button")) { if (fSelected) { - fSelected->fMode = (SkBlendMode)evt.getFast32(); + fSelected->fMode = (SkXfermode::Mode)evt.getFast32(); this->inval(nullptr); } return true; diff --git a/samplecode/SampleXfermodesBlur.cpp b/samplecode/SampleXfermodesBlur.cpp index fe07c9b..ef25114 100644 --- a/samplecode/SampleXfermodesBlur.cpp +++ b/samplecode/SampleXfermodesBlur.cpp @@ -37,7 +37,8 @@ class XfermodesBlurView : public SampleView { SkBitmap fBG; SkBitmap fSrcB, fDstB; - void draw_mode(SkCanvas* canvas, SkBlendMode mode, int alpha, SkScalar x, SkScalar y) { + void draw_mode(SkCanvas* canvas, sk_sp mode, int alpha, + SkScalar x, SkScalar y) { SkPaint p; p.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle, SkBlurMask::ConvertRadiusToSigma(5), @@ -54,7 +55,7 @@ class XfermodesBlurView : public SampleView { r.offset(x, y); canvas->drawOval(r, p); - p.setBlendMode(mode); + p.setXfermode(std::move(mode)); // draw a square overlapping the circle // in the lower right of the canvas @@ -109,23 +110,34 @@ protected: } const struct { - SkBlendMode fMode; - const char* fLabel; + SkXfermode::Mode fMode; + const char* fLabel; } gModes[] = { - { SkBlendMode::kClear, "Clear" }, - { SkBlendMode::kSrc, "Src" }, - { SkBlendMode::kDst, "Dst" }, - { SkBlendMode::kSrcOver, "SrcOver" }, - { SkBlendMode::kDstOver, "DstOver" }, - { SkBlendMode::kSrcIn, "SrcIn" }, - { SkBlendMode::kDstIn, "DstIn" }, - { SkBlendMode::kSrcOut, "SrcOut" }, - { SkBlendMode::kDstOut, "DstOut" }, - { SkBlendMode::kSrcATop, "SrcATop" }, - { SkBlendMode::kDstATop, "DstATop" }, - { SkBlendMode::kXor, "Xor" }, - - { SkBlendMode::kPlus, "Plus" }, + { SkXfermode::kClear_Mode, "Clear" }, + { SkXfermode::kSrc_Mode, "Src" }, + { SkXfermode::kDst_Mode, "Dst" }, + { SkXfermode::kSrcOver_Mode, "SrcOver" }, + { SkXfermode::kDstOver_Mode, "DstOver" }, + { SkXfermode::kSrcIn_Mode, "SrcIn" }, + { SkXfermode::kDstIn_Mode, "DstIn" }, + { SkXfermode::kSrcOut_Mode, "SrcOut" }, + { SkXfermode::kDstOut_Mode, "DstOut" }, + { SkXfermode::kSrcATop_Mode, "SrcATop" }, + { SkXfermode::kDstATop_Mode, "DstATop" }, + { SkXfermode::kXor_Mode, "Xor" }, + + { SkXfermode::kPlus_Mode, "Plus" }, + /*{ SkXfermode::kModulate_Mode, "Modulate" }, + { SkXfermode::kScreen_Mode, "Screen" }, + { SkXfermode::kOverlay_Mode, "Overlay" }, + { SkXfermode::kDarken_Mode, "Darken" }, + { SkXfermode::kLighten_Mode, "Lighten" }, + { SkXfermode::kColorDodge_Mode, "ColorDodge" }, + { SkXfermode::kColorBurn_Mode, "ColorBurn" }, + { SkXfermode::kHardLight_Mode, "HardLight" }, + { SkXfermode::kSoftLight_Mode, "SoftLight" }, + { SkXfermode::kDifference_Mode, "Difference" }, + { SkXfermode::kExclusion_Mode, "Exclusion" },*/ }; const SkScalar w = SkIntToScalar(W); @@ -156,7 +168,8 @@ protected: canvas->drawRect(r, p); canvas->saveLayer(&r, nullptr); - draw_mode(canvas, gModes[i].fMode, twice ? 0x88 : 0xFF, r.fLeft, r.fTop); + draw_mode(canvas, SkXfermode::Make(gModes[i].fMode), + twice ? 0x88 : 0xFF, r.fLeft, r.fTop); canvas->restore(); r.inset(-SK_ScalarHalf, -SK_ScalarHalf); diff --git a/src/c/sk_paint.cpp b/src/c/sk_paint.cpp index 126170c..f82cd81 100644 --- a/src/c/sk_paint.cpp +++ b/src/c/sk_paint.cpp @@ -5,7 +5,6 @@ * found in the LICENSE file. */ -#include "SkBlendMode.h" #include "SkMaskFilter.h" #include "SkPaint.h" #include "SkShader.h" @@ -133,41 +132,41 @@ void sk_paint_set_stroke_join(sk_paint_t* cpaint, sk_stroke_join_t cjoin) { void sk_paint_set_xfermode_mode(sk_paint_t* paint, sk_xfermode_mode_t mode) { SkASSERT(paint); - SkBlendMode skmode; + SkXfermode::Mode skmode; switch (mode) { #define MAP(X, Y) case (X): skmode = (Y); break - MAP( CLEAR_SK_XFERMODE_MODE, SkBlendMode::kClear ); - MAP( SRC_SK_XFERMODE_MODE, SkBlendMode::kSrc ); - MAP( DST_SK_XFERMODE_MODE, SkBlendMode::kDst ); - MAP( SRCOVER_SK_XFERMODE_MODE, SkBlendMode::kSrcOver ); - MAP( DSTOVER_SK_XFERMODE_MODE, SkBlendMode::kDstOver ); - MAP( SRCIN_SK_XFERMODE_MODE, SkBlendMode::kSrcIn ); - MAP( DSTIN_SK_XFERMODE_MODE, SkBlendMode::kDstIn ); - MAP( SRCOUT_SK_XFERMODE_MODE, SkBlendMode::kSrcOut ); - MAP( DSTOUT_SK_XFERMODE_MODE, SkBlendMode::kDstOut ); - MAP( SRCATOP_SK_XFERMODE_MODE, SkBlendMode::kSrcATop ); - MAP( DSTATOP_SK_XFERMODE_MODE, SkBlendMode::kDstATop ); - MAP( XOR_SK_XFERMODE_MODE, SkBlendMode::kXor ); - MAP( PLUS_SK_XFERMODE_MODE, SkBlendMode::kPlus ); - MAP( MODULATE_SK_XFERMODE_MODE, SkBlendMode::kModulate ); - MAP( SCREEN_SK_XFERMODE_MODE, SkBlendMode::kScreen ); - MAP( OVERLAY_SK_XFERMODE_MODE, SkBlendMode::kOverlay ); - MAP( DARKEN_SK_XFERMODE_MODE, SkBlendMode::kDarken ); - MAP( LIGHTEN_SK_XFERMODE_MODE, SkBlendMode::kLighten ); - MAP( COLORDODGE_SK_XFERMODE_MODE, SkBlendMode::kColorDodge ); - MAP( COLORBURN_SK_XFERMODE_MODE, SkBlendMode::kColorBurn ); - MAP( HARDLIGHT_SK_XFERMODE_MODE, SkBlendMode::kHardLight ); - MAP( SOFTLIGHT_SK_XFERMODE_MODE, SkBlendMode::kSoftLight ); - MAP( DIFFERENCE_SK_XFERMODE_MODE, SkBlendMode::kDifference ); - MAP( EXCLUSION_SK_XFERMODE_MODE, SkBlendMode::kExclusion ); - MAP( MULTIPLY_SK_XFERMODE_MODE, SkBlendMode::kMultiply ); - MAP( HUE_SK_XFERMODE_MODE, SkBlendMode::kHue ); - MAP( SATURATION_SK_XFERMODE_MODE, SkBlendMode::kSaturation ); - MAP( COLOR_SK_XFERMODE_MODE, SkBlendMode::kColor ); - MAP( LUMINOSITY_SK_XFERMODE_MODE, SkBlendMode::kLuminosity ); + MAP( CLEAR_SK_XFERMODE_MODE, SkXfermode::kClear_Mode ); + MAP( SRC_SK_XFERMODE_MODE, SkXfermode::kSrc_Mode ); + MAP( DST_SK_XFERMODE_MODE, SkXfermode::kDst_Mode ); + MAP( SRCOVER_SK_XFERMODE_MODE, SkXfermode::kSrcOver_Mode ); + MAP( DSTOVER_SK_XFERMODE_MODE, SkXfermode::kDstOver_Mode ); + MAP( SRCIN_SK_XFERMODE_MODE, SkXfermode::kSrcIn_Mode ); + MAP( DSTIN_SK_XFERMODE_MODE, SkXfermode::kDstIn_Mode ); + MAP( SRCOUT_SK_XFERMODE_MODE, SkXfermode::kSrcOut_Mode ); + MAP( DSTOUT_SK_XFERMODE_MODE, SkXfermode::kDstOut_Mode ); + MAP( SRCATOP_SK_XFERMODE_MODE, SkXfermode::kSrcATop_Mode ); + MAP( DSTATOP_SK_XFERMODE_MODE, SkXfermode::kDstATop_Mode ); + MAP( XOR_SK_XFERMODE_MODE, SkXfermode::kXor_Mode ); + MAP( PLUS_SK_XFERMODE_MODE, SkXfermode::kPlus_Mode ); + MAP( MODULATE_SK_XFERMODE_MODE, SkXfermode::kModulate_Mode ); + MAP( SCREEN_SK_XFERMODE_MODE, SkXfermode::kScreen_Mode ); + MAP( OVERLAY_SK_XFERMODE_MODE, SkXfermode::kOverlay_Mode ); + MAP( DARKEN_SK_XFERMODE_MODE, SkXfermode::kDarken_Mode ); + MAP( LIGHTEN_SK_XFERMODE_MODE, SkXfermode::kLighten_Mode ); + MAP( COLORDODGE_SK_XFERMODE_MODE, SkXfermode::kColorDodge_Mode ); + MAP( COLORBURN_SK_XFERMODE_MODE, SkXfermode::kColorBurn_Mode ); + MAP( HARDLIGHT_SK_XFERMODE_MODE, SkXfermode::kHardLight_Mode ); + MAP( SOFTLIGHT_SK_XFERMODE_MODE, SkXfermode::kSoftLight_Mode ); + MAP( DIFFERENCE_SK_XFERMODE_MODE, SkXfermode::kDifference_Mode ); + MAP( EXCLUSION_SK_XFERMODE_MODE, SkXfermode::kExclusion_Mode ); + MAP( MULTIPLY_SK_XFERMODE_MODE, SkXfermode::kMultiply_Mode ); + MAP( HUE_SK_XFERMODE_MODE, SkXfermode::kHue_Mode ); + MAP( SATURATION_SK_XFERMODE_MODE, SkXfermode::kSaturation_Mode ); + MAP( COLOR_SK_XFERMODE_MODE, SkXfermode::kColor_Mode ); + MAP( LUMINOSITY_SK_XFERMODE_MODE, SkXfermode::kLuminosity_Mode ); #undef MAP default: return; } - AsPaint(paint)->setBlendMode(skmode); + AsPaint(paint)->setXfermodeMode(skmode); } diff --git a/src/core/SkBitmapDevice.cpp b/src/core/SkBitmapDevice.cpp index 26d253c..440de68 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 || - !paint.isSrcOver()) + !SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode)) { return true; } diff --git a/src/core/SkBlendModePriv.h b/src/core/SkBlendModePriv.h deleted file mode 100644 index b5d9e75..0000000 --- a/src/core/SkBlendModePriv.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * 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 ce689d7..db9fcda 100644 --- a/src/core/SkBlitter.cpp +++ b/src/core/SkBlitter.cpp @@ -810,7 +810,7 @@ SkBlitter* SkBlitter::Choose(const SkPixmap& device, SkShader* shader = origPaint.getShader(); SkColorFilter* cf = origPaint.getColorFilter(); - SkBlendMode mode = origPaint.getBlendMode(); + SkXfermode* mode = origPaint.getXfermode(); sk_sp shader3D; SkTCopyOnFirstWrite paint(origPaint); @@ -823,12 +823,12 @@ SkBlitter* SkBlitter::Choose(const SkPixmap& device, shader = shader3D.get(); } - if (mode != SkBlendMode::kSrcOver) { + if (mode) { bool deviceIsOpaque = kRGB_565_SkColorType == device.colorType(); switch (SkInterpretXfermode(*paint, deviceIsOpaque)) { case kSrcOver_SkXfermodeInterpretation: - mode = SkBlendMode::kSrcOver; - paint.writable()->setBlendMode(mode); + mode = nullptr; + paint.writable()->setXfermode(nullptr); break; case kSkipDrawing_SkXfermodeInterpretation:{ return allocator->createT(); @@ -843,13 +843,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 (mode == SkBlendMode::kClear) { + if (SkXfermode::IsMode(mode, SkXfermode::kClear_Mode)) { SkPaint* p = paint.writable(); p->setShader(nullptr); shader = nullptr; p->setColorFilter(nullptr); cf = nullptr; - p->setBlendMode(mode = SkBlendMode::kSrc); + mode = p->setXfermodeMode(SkXfermode::kSrc_Mode); p->setColor(0); } @@ -858,7 +858,7 @@ SkBlitter* SkBlitter::Choose(const SkPixmap& device, } if (nullptr == shader) { - if (mode != SkBlendMode::kSrcOver) { + if (mode) { // xfermodes (and filters) require shaders for our current blitters paint.writable()->setShader(SkShader::MakeColorShader(paint->getColor())); paint.writable()->setAlpha(0xFF); @@ -909,7 +909,7 @@ SkBlitter* SkBlitter::Choose(const SkPixmap& device, case kAlpha_8_SkColorType: if (drawCoverage) { SkASSERT(nullptr == shader); - SkASSERT(paint->isSrcOver()); + SkASSERT(nullptr == paint->getXfermode()); 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 cb7d718..6697614 100644 --- a/src/core/SkBlitter_A8.cpp +++ b/src/core/SkBlitter_A8.cpp @@ -230,8 +230,10 @@ SkA8_Shader_Blitter::SkA8_Shader_Blitter(const SkPixmap& device, const SkPaint& SkShader::Context* shaderContext) : INHERITED(device, paint, shaderContext) { - fXfermode = SkXfermode::Peek(paint.getBlendMode()); - SkASSERT(!fXfermode || fShaderContext); + if ((fXfermode = paint.getXfermode()) != nullptr) { + fXfermode->ref(); + SkASSERT(fShaderContext); + } int width = device.width(); fBuffer = (SkPMColor*)sk_malloc_throw(sizeof(SkPMColor) * (width + (SkAlign4(width) >> 2))); @@ -239,6 +241,7 @@ SkA8_Shader_Blitter::SkA8_Shader_Blitter(const SkPixmap& device, const SkPaint& } SkA8_Shader_Blitter::~SkA8_Shader_Blitter() { + if (fXfermode) SkSafeUnref(fXfermode); sk_free(fBuffer); } @@ -352,7 +355,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(paint.isSrcOver()); + SkASSERT(nullptr == paint.getXfermode()); SkASSERT(nullptr == paint.getColorFilter()); } diff --git a/src/core/SkBlitter_ARGB32.cpp b/src/core/SkBlitter_ARGB32.cpp index ea0554d..aada058 100644 --- a/src/core/SkBlitter_ARGB32.cpp +++ b/src/core/SkBlitter_ARGB32.cpp @@ -339,7 +339,8 @@ SkARGB32_Shader_Blitter::SkARGB32_Shader_Blitter(const SkPixmap& device, { fBuffer = (SkPMColor*)sk_malloc_throw(device.width() * (sizeof(SkPMColor))); - fXfermode = SkXfermode::Peek(paint.getBlendMode()); + fXfermode = paint.getXfermode(); + SkSafeRef(fXfermode); int flags = 0; if (!(shaderContext->getFlags() & SkShader::kOpaqueAlpha_Flag)) { @@ -369,6 +370,7 @@ 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 d63e924..455a97b 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 = SkXfermode::Peek(paint.getBlendMode()); + fXfer = paint.getXfermode(); 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 = SkXfermode::Peek(paint.getBlendMode()); + bstate.fXfer = paint.getXfermode(); (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 7860b7c..066ec61 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.isSrcOver()); + SkASSERT(paint.getXfermode() == nullptr); 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.isSrcOver()); + SkASSERT(paint.getXfermode() == nullptr); fBuffer = (SkPMColor*)sk_malloc_throw(device.width() * sizeof(SkPMColor)); @@ -809,8 +809,9 @@ SkRGB16_Shader_Xfermode_Blitter::SkRGB16_Shader_Xfermode_Blitter( SkShader::Context* shaderContext) : INHERITED(device, paint, shaderContext) { - fXfermode = SkXfermode::Peek(paint.getBlendMode()); + fXfermode = paint.getXfermode(); SkASSERT(fXfermode); + fXfermode->ref(); int width = device.width(); fBuffer = (SkPMColor*)sk_malloc_throw((width + (SkAlign4(width) >> 2)) * sizeof(SkPMColor)); @@ -818,6 +819,7 @@ SkRGB16_Shader_Xfermode_Blitter::SkRGB16_Shader_Xfermode_Blitter( } SkRGB16_Shader_Xfermode_Blitter::~SkRGB16_Shader_Xfermode_Blitter() { + fXfermode->unref(); sk_free(fBuffer); } @@ -895,14 +897,14 @@ SkBlitter* SkBlitter_ChooseD565(const SkPixmap& device, const SkPaint& paint, SkBlitter* blitter; SkShader* shader = paint.getShader(); - bool is_srcover = paint.isSrcOver(); + SkXfermode* mode = paint.getXfermode(); // we require a shader if there is an xfermode, handled by our caller - SkASSERT(is_srcover || shader); + SkASSERT(nullptr == mode || shader); if (shader) { SkASSERT(shaderContext != nullptr); - if (!is_srcover) { + if (mode) { blitter = allocator->createT(device, paint, shaderContext); } else { diff --git a/src/core/SkBlitter_Sprite.cpp b/src/core/SkBlitter_Sprite.cpp index cef4cfa..950f187 100644 --- a/src/core/SkBlitter_Sprite.cpp +++ b/src/core/SkBlitter_Sprite.cpp @@ -68,11 +68,14 @@ public: if (0xFF != paint.getAlpha()) { return false; } - SkBlendMode mode = paint.getBlendMode(); - if (SkBlendMode::kSrc == mode) { + SkXfermode::Mode mode; + if (!SkXfermode::AsMode(paint.getXfermode(), &mode)) { + return false; + } + if (SkXfermode::kSrc_Mode == mode) { return true; } - if (SkBlendMode::kSrcOver == mode && src.isOpaque()) { + if (SkXfermode::kSrcOver_Mode == mode && src.isOpaque()) { return true; } @@ -82,7 +85,7 @@ public: return false; } - return SkBlendMode::kSrcOver == mode; + return SkXfermode::kSrcOver_Mode == mode; } SkSpriteBlitter_Src_SrcOver(const SkPixmap& src) @@ -91,11 +94,14 @@ 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); - SkBlendMode mode = paint.getBlendMode(); + SkXfermode::Mode mode; + if (!SkXfermode::AsMode(paint.getXfermode(), &mode)) { + SkFAIL("Should never happen."); + } - SkASSERT(mode == SkBlendMode::kSrcOver || mode == SkBlendMode::kSrc); + SkASSERT(mode == SkXfermode::kSrcOver_Mode || mode == SkXfermode::kSrc_Mode); - if (mode == SkBlendMode::kSrcOver && !fSource.isOpaque()) { + if (mode == SkXfermode::kSrcOver_Mode && !fSource.isOpaque()) { fUseMemcpy = false; } } diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp index ce47d5c..c55ca10 100644 --- a/src/core/SkCanvas.cpp +++ b/src/core/SkCanvas.cpp @@ -484,7 +484,7 @@ public: */ SkPaint tmp; tmp.setImageFilter(fPaint->getImageFilter()); - tmp.setBlendMode(fPaint->getBlendMode()); + tmp.setXfermode(sk_ref_sp(fPaint->getXfermode())); 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->setBlendMode(SkBlendMode::kSrcOver); + paint->setXfermode(nullptr); } if (fLooperContext && !fLooperContext->next(fCanvas, paint)) { @@ -2690,7 +2690,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.isSrcOver())) { + (paint.getAlpha() == 0 && paint.getXfermode() == nullptr)) { return; } @@ -2994,21 +2994,26 @@ 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, SkBlendMode mode) { +void SkCanvas::drawARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b, + SkXfermode::Mode mode) { TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawARGB()"); SkPaint paint; paint.setARGB(a, r, g, b); - paint.setBlendMode(mode); + if (SkXfermode::kSrcOver_Mode != mode) { + paint.setXfermodeMode(mode); + } this->drawPaint(paint); } -void SkCanvas::drawColor(SkColor c, SkBlendMode mode) { +void SkCanvas::drawColor(SkColor c, SkXfermode::Mode mode) { TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawColor()"); SkPaint paint; paint.setColor(c); - paint.setBlendMode(mode); + if (SkXfermode::kSrcOver_Mode != mode) { + paint.setXfermodeMode(mode); + } this->drawPaint(paint); } diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp index c6c5cf3..34c7d73 100644 --- a/src/core/SkDraw.cpp +++ b/src/core/SkDraw.cpp @@ -7,7 +7,6 @@ #define __STDC_LIMIT_MACROS #include "SkDraw.h" -#include "SkBlendModePriv.h" #include "SkBlitter.h" #include "SkCanvas.h" #include "SkColorPriv.h" @@ -164,27 +163,31 @@ static BitmapXferProc ChooseBitmapXferProc(const SkPixmap& dst, const SkPaint& p return nullptr; } - SkBlendMode mode = paint.getBlendMode(); + SkXfermode::Mode mode; + if (!SkXfermode::AsMode(paint.getXfermode(), &mode)) { + return nullptr; + } + SkColor color = paint.getColor(); // collaps modes based on color... - if (SkBlendMode::kSrcOver == mode) { + if (SkXfermode::kSrcOver_Mode == mode) { unsigned alpha = SkColorGetA(color); if (0 == alpha) { - mode = SkBlendMode::kDst; + mode = SkXfermode::kDst_Mode; } else if (0xFF == alpha) { - mode = SkBlendMode::kSrc; + mode = SkXfermode::kSrc_Mode; } } switch (mode) { - case SkBlendMode::kClear: + case SkXfermode::kClear_Mode: // SkDebugf("--- D_Clear_BitmapXferProc\n"); return D_Clear_BitmapXferProc; // ignore data - case SkBlendMode::kDst: + case SkXfermode::kDst_Mode: // SkDebugf("--- D_Dst_BitmapXferProc\n"); return D_Dst_BitmapXferProc; // ignore data - case SkBlendMode::kSrc: { + case SkXfermode::kSrc_Mode: { /* should I worry about dithering for the lower depths? */ @@ -1140,7 +1143,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 (SkBlendMode_SupportsCoverageAsAlpha(origPaint.getBlendMode())) { + } else if (SkXfermode::SupportsCoverageAsAlpha(origPaint.getXfermode())) { U8CPU newAlpha; #if 0 newAlpha = SkToU8(SkScalarRoundToInt(coverage * diff --git a/src/core/SkGpuBlurUtils.cpp b/src/core/SkGpuBlurUtils.cpp index ec3b0a9..5b29884 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(SkBlendMode::kSrc); + paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); 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(SkBlendMode::kSrc); + paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); 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(SkBlendMode::kSrc); + paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); 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(SkBlendMode::kSrc); + paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); SkIRect dstRect(srcRect); scale_irect(&dstRect, scaleFactorX, scaleFactorY); diff --git a/src/core/SkImageFilter.cpp b/src/core/SkImageFilter.cpp index 68183cc..63095bc 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(SkBlendMode::kSrc); + paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); 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 0a33280..12efc64 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.setBlendMode(SkBlendMode::kSrc); + paint.setXfermodeMode(SkXfermode::kSrc_Mode); paint.setFilterQuality(fFilterQuality); input->draw(canvas, srcRect.x(), srcRect.y(), &paint); diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp index 83e45c0..9d76a16 100644 --- a/src/core/SkPaint.cpp +++ b/src/core/SkPaint.cpp @@ -52,7 +52,6 @@ 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; @@ -70,6 +69,7 @@ SkPaint::SkPaint(const SkPaint& src) : COPY(fTypeface) , COPY(fPathEffect) , COPY(fShader) + , COPY(fXfermode) , COPY(fMaskFilter) , COPY(fColorFilter) , COPY(fRasterizer) @@ -81,7 +81,6 @@ SkPaint::SkPaint(const SkPaint& src) , COPY(fColor) , COPY(fWidth) , COPY(fMiterLimit) - , COPY(fBlendMode) , COPY(fBitfields) #undef COPY {} @@ -91,6 +90,7 @@ SkPaint::SkPaint(SkPaint&& src) { MOVE(fTypeface); MOVE(fPathEffect); MOVE(fShader); + MOVE(fXfermode); MOVE(fMaskFilter); MOVE(fColorFilter); MOVE(fRasterizer); @@ -102,7 +102,6 @@ SkPaint::SkPaint(SkPaint&& src) { MOVE(fColor); MOVE(fWidth); MOVE(fMiterLimit); - MOVE(fBlendMode); MOVE(fBitfields); #undef MOVE } @@ -118,6 +117,7 @@ SkPaint& SkPaint::operator=(const SkPaint& src) { ASSIGN(fTypeface); ASSIGN(fPathEffect); ASSIGN(fShader); + ASSIGN(fXfermode); ASSIGN(fMaskFilter); ASSIGN(fColorFilter); ASSIGN(fRasterizer); @@ -129,7 +129,6 @@ SkPaint& SkPaint::operator=(const SkPaint& src) { ASSIGN(fColor); ASSIGN(fWidth); ASSIGN(fMiterLimit); - ASSIGN(fBlendMode); ASSIGN(fBitfields); #undef ASSIGN @@ -145,6 +144,7 @@ SkPaint& SkPaint::operator=(SkPaint&& src) { MOVE(fTypeface); MOVE(fPathEffect); MOVE(fShader); + MOVE(fXfermode); MOVE(fMaskFilter); MOVE(fColorFilter); MOVE(fRasterizer); @@ -156,7 +156,6 @@ SkPaint& SkPaint::operator=(SkPaint&& src) { MOVE(fColor); MOVE(fWidth); MOVE(fMiterLimit); - MOVE(fBlendMode); MOVE(fBitfields); #undef MOVE @@ -168,6 +167,7 @@ bool operator==(const SkPaint& a, const SkPaint& b) { return EQUAL(fTypeface) && EQUAL(fPathEffect) && EQUAL(fShader) + && EQUAL(fXfermode) && EQUAL(fMaskFilter) && EQUAL(fColorFilter) && EQUAL(fRasterizer) @@ -179,7 +179,6 @@ bool operator==(const SkPaint& a, const SkPaint& b) { && EQUAL(fColor) && EQUAL(fWidth) && EQUAL(fMiterLimit) - && EQUAL(fBlendMode) && EQUAL(fBitfieldsUInt) ; #undef EQUAL @@ -361,6 +360,7 @@ MOVE_FIELD(Rasterizer) MOVE_FIELD(ImageFilter) MOVE_FIELD(Shader) MOVE_FIELD(ColorFilter) +MOVE_FIELD(Xfermode) MOVE_FIELD(PathEffect) MOVE_FIELD(MaskFilter) MOVE_FIELD(DrawLooper) @@ -385,6 +385,9 @@ SET_PTR(Shader) #ifdef SK_SUPPORT_LEGACY_COLORFILTER_PTR SET_PTR(ColorFilter) #endif +#ifdef SK_SUPPORT_LEGACY_XFERMODE_PTR +SET_PTR(Xfermode) +#endif #ifdef SK_SUPPORT_LEGACY_PATHEFFECT_PTR SET_PTR(PathEffect) #endif @@ -400,18 +403,10 @@ 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) { - this->setBlendMode((SkBlendMode)mode); - return SkXfermode::Peek((SkBlendMode)mode); + fXfermode = SkXfermode::Make(mode); + return fXfermode.get(); // can/should we change this API to be void, like the other setters? } -#endif /////////////////////////////////////////////////////////////////////////////// @@ -1909,6 +1904,7 @@ 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()) | @@ -1927,8 +1923,7 @@ 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() << 4) | this->getTextEncoding(), - fBlendMode)); + this->getStyle(), this->getTextEncoding())); // now we're done with ptr and the (pre)reserved space. If we need to write // additional fields, use the buffer directly @@ -1938,6 +1933,7 @@ 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()); @@ -1959,14 +1955,8 @@ void SkPaint::unflatten(SkReadBuffer& buffer) { uint32_t tmp = buffer.readUInt(); this->setStrokeCap(static_cast((tmp >> 24) & 0xFF)); this->setStrokeJoin(static_cast((tmp >> 16) & 0xFF)); - if (buffer.isVersionLT(SkReadBuffer::kXfermodeToBlendMode_Version)) { - this->setStyle(static_cast