Revert[8] "replace SkXfermode obj with SkBlendMode enum in paints"

This reverts commit c245574ba3d0e2ade6c94b2812de3baa383bf4c4.

BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2396953002

TBR=

Review-Url: https://codereview.chromium.org/2396953002
diff --git a/gm/aaclip.cpp b/gm/aaclip.cpp
index 26a25c1..f00a4cd 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.setXfermodeMode(SkXfermode::kSrc_Mode);
+    paint.setBlendMode(SkBlendMode::kSrc);
     paint.setColor(0x800000FF);
     canvas->drawRect(r, paint);
 }
diff --git a/gm/aarectmodes.cpp b/gm/aarectmodes.cpp
index 6e9f4bf..ebc47c2 100644
--- a/gm/aarectmodes.cpp
+++ b/gm/aarectmodes.cpp
@@ -59,21 +59,21 @@
 }
 
 constexpr struct {
-    SkXfermode::Mode  fMode;
-    const char*         fLabel;
+    SkBlendMode fMode;
+    const char* fLabel;
 } gModes[] = {
-    { 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"       },
+    { 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"       },
 };
 
 const int gWidth = 64;
@@ -81,7 +81,7 @@
 const SkScalar W = SkIntToScalar(gWidth);
 const SkScalar H = SkIntToScalar(gHeight);
 
-static SkScalar drawCell(SkCanvas* canvas, sk_sp<SkXfermode> mode, SkAlpha a0, SkAlpha a1) {
+static SkScalar drawCell(SkCanvas* canvas, SkBlendMode mode, SkAlpha a0, SkAlpha a1) {
 
     SkPaint paint;
     paint.setAntiAlias(true);
@@ -95,7 +95,7 @@
 
     paint.setColor(SK_ColorRED);
     paint.setAlpha(a1);
-    paint.setXfermode(std::move(mode));
+    paint.setBlendMode(mode);
 
     SkScalar offset = SK_Scalar1 / 3;
     SkRect rect = SkRect::MakeXYWH(W / 4 + offset,
@@ -155,7 +155,7 @@
                     }
                     canvas->drawRect(bounds, fBGPaint);
                     canvas->saveLayer(&bounds, nullptr);
-                    SkScalar dy = drawCell(canvas, SkXfermode::Make(gModes[i].fMode),
+                    SkScalar dy = drawCell(canvas, gModes[i].fMode,
                                            gAlphaValue[alpha & 1],
                                            gAlphaValue[alpha & 2]);
                     canvas->restore();
diff --git a/gm/aaxfermodes.cpp b/gm/aaxfermodes.cpp
index 678a837..7106ce8 100644
--- a/gm/aaxfermodes.cpp
+++ b/gm/aaxfermodes.cpp
@@ -121,7 +121,7 @@
                 if (firstMode + m > SkXfermode::kLastMode) {
                     break;
                 }
-                SkXfermode::Mode mode = static_cast<SkXfermode::Mode>(firstMode + m);
+                SkBlendMode mode = static_cast<SkBlendMode>(firstMode + m);
                 canvas->save();
 
                 if (kShape_Pass == drawingPass) {
@@ -144,7 +144,7 @@
                                         10);
                             } else {
                                 SkASSERT(kBackground_Pass == drawingPass);
-                                canvas->drawColor(kBGColor, SkXfermode::kSrc_Mode);
+                                canvas->drawColor(kBGColor, SkBlendMode::kSrc);
                             }
                             canvas->restore();
                         } else {
@@ -190,18 +190,17 @@
         canvas->restore();
     }
 
-    void drawModeName(SkCanvas* canvas, SkXfermode::Mode mode) {
-        const char* modeName = mode <= SkXfermode::kLastMode ? SkXfermode::ModeName(mode)
-                                                             : "Arithmetic";
+    void drawModeName(SkCanvas* canvas, SkBlendMode mode) {
+        const char* modeName = SkXfermode::ModeName(mode);
         fLabelPaint.setTextAlign(SkPaint::kRight_Align);
         canvas->drawText(modeName, strlen(modeName), kLabelSpacing - kShapeSize / 4,
                          fLabelPaint.getTextSize() / 4, fLabelPaint);
     }
 
-    void setupShapePaint(SkCanvas* canvas, GrColor color, SkXfermode::Mode mode, SkPaint* paint) {
+    void setupShapePaint(SkCanvas* canvas, GrColor color, SkBlendMode mode, SkPaint* paint) {
         paint->setColor(color);
 
-        if (mode == SkXfermode::kPlus_Mode) {
+        if (mode == SkBlendMode::kPlus) {
             // Check for overflow, otherwise we might get confusing AA artifacts.
             int maxSum = SkTMax(SkTMax(SkColorGetA(kBGColor) + SkColorGetA(color),
                                        SkColorGetR(kBGColor) + SkColorGetR(color)),
@@ -211,7 +210,7 @@
             if (maxSum > 255) {
                 SkPaint dimPaint;
                 dimPaint.setAntiAlias(false);
-                dimPaint.setXfermodeMode(SkXfermode::kDstIn_Mode);
+                dimPaint.setBlendMode(SkBlendMode::kDstIn);
                 if (255 != paint->getAlpha()) {
                     // Dim the src and dst colors.
                     dimPaint.setARGB(255 * 255 / maxSum, 0, 0, 0);
@@ -227,11 +226,11 @@
         }
     }
 
-    void drawShape(SkCanvas* canvas, Shape shape, const SkPaint& paint, SkXfermode::Mode mode) {
-        SkASSERT(mode <= SkXfermode::kLastMode);
+    void drawShape(SkCanvas* canvas, Shape shape, const SkPaint& paint, SkBlendMode mode) {
+        SkASSERT(mode <= SkBlendMode::kLastMode);
         SkPaint shapePaint(paint);
         shapePaint.setAntiAlias(kSquare_Shape != shape);
-        shapePaint.setXfermodeMode(mode);
+        shapePaint.setBlendMode(mode);
 
         switch (shape) {
             case kSquare_Shape:
@@ -249,7 +248,7 @@
 
             case kOval_Shape:
                 canvas->save();
-                canvas->rotate(static_cast<SkScalar>((511 * mode + 257) % 360));
+                canvas->rotate(static_cast<SkScalar>((511 * (int)mode + 257) % 360));
                 canvas->drawPath(fOval, shapePaint);
                 canvas->restore();
                 break;
diff --git a/gm/bitmaprect.cpp b/gm/bitmaprect.cpp
index 2a81300..06bf36a 100644
--- a/gm/bitmaprect.cpp
+++ b/gm/bitmaprect.cpp
@@ -201,7 +201,7 @@
     void onDraw(SkCanvas* canvas) override {
         SkPaint paint;
         paint.setAlpha(128);
-        paint.setXfermode(SkXfermode::Make(SkXfermode::kXor_Mode));
+        paint.setBlendMode(SkBlendMode::kXor);
 
         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 a087064..a0359c3 100644
--- a/gm/blurredclippedcircle.cpp
+++ b/gm/blurredclippedcircle.cpp
@@ -34,7 +34,7 @@
     void onDraw(SkCanvas* canvas) override {
         SkPaint whitePaint;
         whitePaint.setColor(SK_ColorWHITE);
-        whitePaint.setXfermode(SkXfermode::Make(SkXfermode::kSrc_Mode));
+        whitePaint.setBlendMode(SkBlendMode::kSrc);
         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 202f72a..f6d51fc 100644
--- a/gm/colormatrix.cpp
+++ b/gm/colormatrix.cpp
@@ -77,7 +77,7 @@
         SkPaint paint;
         SkColorMatrix matrix;
 
-        paint.setXfermodeMode(SkXfermode::kSrc_Mode);
+        paint.setBlendMode(SkBlendMode::kSrc);
         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 554282f..9b715ef 100644
--- a/gm/colortypexfermode.cpp
+++ b/gm/colortypexfermode.cpp
@@ -57,39 +57,39 @@
         canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
 
         const struct {
-            SkXfermode::Mode  fMode;
-            const char*       fLabel;
+            SkBlendMode fMode;
+            const char* fLabel;
         } gModes[] = {
-            { 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"     },
+            { 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"     },
 
-            { 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"  },
+            { 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"  },
         };
 
         const SkScalar w = SkIntToScalar(W);
@@ -128,7 +128,7 @@
             p.setShader(nullptr);
             canvas->drawRect(r, p);
 
-            textP.setXfermode(SkXfermode::Make(gModes[i].fMode));
+            textP.setBlendMode(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 dd81628..43b103c 100644
--- a/gm/drawatlas.cpp
+++ b/gm/drawatlas.cpp
@@ -23,12 +23,12 @@
         canvas->clear(SK_ColorRED);
 
         SkPaint paint;
-        paint.setXfermodeMode(SkXfermode::kClear_Mode);
+        paint.setBlendMode(SkBlendMode::kClear);
         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.setXfermode(nullptr);
+        paint.setBlendMode(SkBlendMode::kSrcOver);
         paint.setColor(SK_ColorBLUE);
         paint.setAntiAlias(true);
         canvas->drawOval(target, paint);
diff --git a/gm/drawatlascolor.cpp b/gm/drawatlascolor.cpp
index d7b973c..bf76c48 100644
--- a/gm/drawatlascolor.cpp
+++ b/gm/drawatlascolor.cpp
@@ -26,7 +26,7 @@
     SkCanvas* canvas = surface->getCanvas();
 
     SkPaint paint;
-    paint.setXfermode(SkXfermode::Make(SkXfermode::kSrc_Mode));
+    paint.setBlendMode(SkBlendMode::kSrc);
 
     paint.setColor(SK_ColorWHITE);
     SkRect r = SkRect::MakeXYWH(0, 0,
diff --git a/gm/dstreadshuffle.cpp b/gm/dstreadshuffle.cpp
index 47c7056..72a68b1 100644
--- a/gm/dstreadshuffle.cpp
+++ b/gm/dstreadshuffle.cpp
@@ -159,8 +159,8 @@
                             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.setXfermodeMode(r % 3 == 0 ? SkXfermode::kLighten_Mode :
-                                                           SkXfermode::kSrcOver_Mode);
+                            p.setBlendMode(r % 3 == 0 ? SkBlendMode::kLighten :
+                                                        SkBlendMode::kSrcOver);
                             SetStyle(&p, style, width);
                             canvas->save();
                             canvas->translate(x, y);
diff --git a/gm/gamma.cpp b/gm/gamma.cpp
index f6b4a9c..80209e5 100644
--- a/gm/gamma.cpp
+++ b/gm/gamma.cpp
@@ -75,11 +75,11 @@
         advance();
     };
 
-    auto nextXferRect = [&](SkColor srcColor, SkXfermode::Mode mode, SkColor dstColor) {
+    auto nextXferRect = [&](SkColor srcColor, SkBlendMode mode, SkColor dstColor) {
         p.setColor(dstColor);
         canvas->drawRect(r, p);
         p.setColor(srcColor);
-        p.setXfermodeMode(mode);
+        p.setBlendMode(mode);
         canvas->drawRect(r, p);
 
         SkString srcText = SkStringPrintf("%08X", srcColor);
@@ -207,18 +207,18 @@
 
     canvas->saveLayer(nullptr, nullptr);
 
-    nextXferRect(0x7fffffff, SkXfermode::kSrcOver_Mode, SK_ColorBLACK);
-    nextXferRect(0x7f000000, SkXfermode::kSrcOver_Mode, SK_ColorWHITE);
+    nextXferRect(0x7fffffff, SkBlendMode::kSrcOver, SK_ColorBLACK);
+    nextXferRect(0x7f000000, SkBlendMode::kSrcOver, SK_ColorWHITE);
 
-    nextXferRect(SK_ColorBLACK, SkXfermode::kDstOver_Mode, 0x7fffffff);
-    nextXferRect(SK_ColorWHITE, SkXfermode::kSrcIn_Mode, 0x7fff00ff);
-    nextXferRect(0x7fff00ff, SkXfermode::kDstIn_Mode, SK_ColorWHITE);
+    nextXferRect(SK_ColorBLACK, SkBlendMode::kDstOver, 0x7fffffff);
+    nextXferRect(SK_ColorWHITE, SkBlendMode::kSrcIn, 0x7fff00ff);
+    nextXferRect(0x7fff00ff, SkBlendMode::kDstIn, SK_ColorWHITE);
 
     // 0x89 = 255 * linear_to_srgb(0.25)
-    nextXferRect(0xff898989, SkXfermode::kPlus_Mode, 0xff898989);
+    nextXferRect(0xff898989, SkBlendMode::kPlus, 0xff898989);
 
     // 0xDB = 255 * linear_to_srgb(sqrt(0.5))
-    nextXferRect(0xffdbdbdb, SkXfermode::kModulate_Mode, 0xffdbdbdb);
+    nextXferRect(0xffdbdbdb, SkBlendMode::kModulate, 0xffdbdbdb);
 
     canvas->restore();
 }
diff --git a/gm/gm.cpp b/gm/gm.cpp
index b6cac0c..1b0598f 100644
--- a/gm/gm.cpp
+++ b/gm/gm.cpp
@@ -58,7 +58,7 @@
 /////////////////////////////////////////////////////////////////////////////////////////////
 
 void GM::onDrawBackground(SkCanvas* canvas) {
-    canvas->drawColor(fBGColor, SkXfermode::kSrc_Mode);
+    canvas->drawColor(fBGColor, SkBlendMode::kSrc);
 }
 
 void GM::drawSizeBounds(SkCanvas* canvas, SkColor color) {
diff --git a/gm/hairmodes.cpp b/gm/hairmodes.cpp
index de937c4..a628f4a 100644
--- a/gm/hairmodes.cpp
+++ b/gm/hairmodes.cpp
@@ -11,21 +11,21 @@
 #include "SkShader.h"
 
 constexpr struct {
-    SkXfermode::Mode  fMode;
-    const char*         fLabel;
+    SkBlendMode fMode;
+    const char* fLabel;
 } gModes[] = {
-    { 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"       },
+    { 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"       },
 };
 
 const int gWidth = 64;
@@ -33,7 +33,7 @@
 const SkScalar W = SkIntToScalar(gWidth);
 const SkScalar H = SkIntToScalar(gHeight);
 
-static SkScalar drawCell(SkCanvas* canvas, sk_sp<SkXfermode> mode, SkAlpha a0, SkAlpha a1) {
+static SkScalar drawCell(SkCanvas* canvas, SkBlendMode mode, SkAlpha a0, SkAlpha a1) {
 
     SkPaint paint;
     paint.setAntiAlias(true);
@@ -47,7 +47,7 @@
 
     paint.setColor(SK_ColorRED);
     paint.setAlpha(a1);
-    paint.setXfermode(std::move(mode));
+    paint.setBlendMode(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 @@
 
                     canvas->drawRect(bounds, fBGPaint);
                     canvas->saveLayer(&bounds, nullptr);
-                    SkScalar dy = drawCell(canvas, SkXfermode::Make(gModes[i].fMode),
+                    SkScalar dy = drawCell(canvas, gModes[i].fMode,
                                            gAlphaValue[alpha & 1],
                                            gAlphaValue[alpha & 2]);
                     canvas->restore();
diff --git a/gm/imagefilters.cpp b/gm/imagefilters.cpp
index e9f54a3..27422b5 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, SkXfermode::Mode mode, sk_sp<SkImageFilter> imf) {
+static void do_draw(SkCanvas* canvas, SkBlendMode mode, sk_sp<SkImageFilter> imf) {
         SkAutoCanvasRestore acr(canvas, true);
         canvas->clipRect(SkRect::MakeWH(220, 220));
 
@@ -40,7 +40,7 @@
 
         paint.setColor(0x660000FF);
         paint.setImageFilter(std::move(imf));
-        paint.setXfermodeMode(mode);
+        paint.setBlendMode(mode);
         canvas->drawOval(r1, paint);
 }
 
@@ -52,8 +52,8 @@
                                                                  kNone_SkFilterQuality,
                                                                  nullptr));
 
-        const SkXfermode::Mode modes[] = {
-            SkXfermode::kSrcATop_Mode, SkXfermode::kDstIn_Mode
+        const SkBlendMode modes[] = {
+            SkBlendMode::kSrcATop, SkBlendMode::kDstIn
         };
 
         for (size_t i = 0; i < SK_ARRAY_COUNT(modes); ++i) {
diff --git a/gm/imagefiltersgraph.cpp b/gm/imagefiltersgraph.cpp
index 9803989..2d27728 100644
--- a/gm/imagefiltersgraph.cpp
+++ b/gm/imagefiltersgraph.cpp
@@ -69,9 +69,8 @@
             sk_sp<SkImageFilter> colorMorph(SkColorFilterImageFilter::Make(std::move(matrixFilter),
                                                                            std::move(morph)));
             SkPaint paint;
-            paint.setImageFilter(SkXfermodeImageFilter::Make(
-                                        SkXfermode::Make(SkXfermode::kSrcOver_Mode),
-                                        std::move(colorMorph)));
+            paint.setImageFilter(SkXfermodeImageFilter::Make(SkBlendMode::kSrcOver,
+                                                             std::move(colorMorph)));
 
             DrawClippedImage(canvas, fImage.get(), paint);
             canvas->translate(SkIntToScalar(100), 0);
@@ -105,9 +104,8 @@
             SkImageFilter::CropRect cropRect(SkRect::MakeWH(SkIntToScalar(95), SkIntToScalar(100)));
             SkPaint paint;
             paint.setImageFilter(
-                SkXfermodeImageFilter::Make(SkXfermode::Make(SkXfermode::kSrcIn_Mode),
-                                            std::move(blur),
-                                            nullptr, &cropRect));
+                SkXfermodeImageFilter::Make(SkBlendMode::kSrcIn, 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 0906eb3..dc8257c 100644
--- a/gm/imagefilterstransformed.cpp
+++ b/gm/imagefilterstransformed.cpp
@@ -127,7 +127,7 @@
     sk_sp<SkImageFilter> filters[] = {
         nullptr,
         SkBlurImageFilter::Make(6, 0, nullptr),
-        SkXfermodeImageFilter::Make(SkXfermode::Make(SkXfermode::kSrcOver_Mode), nullptr),
+        SkXfermodeImageFilter::Make(SkBlendMode::kSrcOver, nullptr),
     };
 
     for (auto& filter : filters) {
diff --git a/gm/lcdblendmodes.cpp b/gm/lcdblendmodes.cpp
index 537c4cb..a16e219 100644
--- a/gm/lcdblendmodes.cpp
+++ b/gm/lcdblendmodes.cpp
@@ -76,44 +76,44 @@
         this->drawColumn(surfCanvas, SK_ColorCYAN, SK_ColorMAGENTA, true);
 
         SkPaint surfPaint;
-        surfPaint.setXfermode(SkXfermode::Make(SkXfermode::kSrcOver_Mode));
+        surfPaint.setBlendMode(SkBlendMode::kSrcOver);
         surface->draw(canvas, 0, 0, &surfPaint);
     }
 
     void drawColumn(SkCanvas* canvas, SkColor backgroundColor, SkColor textColor, bool useGrad) {
         const struct {
-            SkXfermode::Mode  fMode;
-            const char*       fLabel;
+            SkBlendMode fMode;
+            const char* fLabel;
         } gModes[] = {
-            { 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"  },
+            { 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"  },
         };
         // Draw background rect
         SkPaint backgroundPaint;
@@ -128,7 +128,7 @@
             paint.setSubpixelText(true);
             paint.setLCDRenderText(true);
             paint.setTextSize(fTextHeight);
-            paint.setXfermode(SkXfermode::Make(gModes[m].fMode));
+            paint.setBlendMode(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 623d746..3808785 100644
--- a/gm/lcdoverlap.cpp
+++ b/gm/lcdoverlap.cpp
@@ -49,8 +49,8 @@
 
     SkISize onISize() override { return SkISize::Make(kWidth, kHeight); }
 
-    void drawTestCase(SkCanvas* canvas, SkScalar x, SkScalar y, SkXfermode::Mode mode,
-                      SkXfermode::Mode mode2) {
+    void drawTestCase(SkCanvas* canvas, SkScalar x, SkScalar y, SkBlendMode mode,
+                      SkBlendMode mode2) {
         const SkColor colors[] {
                 SK_ColorRED,
                 SK_ColorGREEN,
@@ -60,8 +60,6 @@
                 SK_ColorMAGENTA,
         };
 
-        sk_sp<SkXfermode> xfermode(SkXfermode::Make(mode));
-        sk_sp<SkXfermode> xfermode2(SkXfermode::Make(mode2));
         for (size_t i = 0; i < SK_ARRAY_COUNT(colors); i++) {
             canvas->save();
             canvas->translate(x, y);
@@ -70,7 +68,7 @@
 
             SkPaint textPaint;
             textPaint.setColor(colors[i]);
-            textPaint.setXfermode(i % 2 == 0 ? xfermode : xfermode2);
+            textPaint.setBlendMode(i % 2 == 0 ? mode : mode2);
             canvas->drawTextBlob(fBlob, 0, 0, textPaint);
             canvas->restore();
         }
@@ -79,13 +77,11 @@
     void onDraw(SkCanvas* canvas) override {
         SkScalar offsetX = kWidth / 4.0f;
         SkScalar offsetY = kHeight / 4.0f;
-        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);
+        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);
     }
 
 private:
diff --git a/gm/lumafilter.cpp b/gm/lumafilter.cpp
index 10eefab..3852d93 100644
--- a/gm/lumafilter.cpp
+++ b/gm/lumafilter.cpp
@@ -26,7 +26,7 @@
                      paint);
 }
 
-static void draw_scene(SkCanvas* canvas, const sk_sp<SkColorFilter>& filter, SkXfermode::Mode mode,
+static void draw_scene(SkCanvas* canvas, const sk_sp<SkColorFilter>& filter, SkBlendMode mode,
                        const sk_sp<SkShader>& s1, const sk_sp<SkShader>& s2) {
     SkPaint paint;
     paint.setAntiAlias(true);
@@ -53,7 +53,7 @@
     }
 
     SkPaint xferPaint;
-    xferPaint.setXfermodeMode(mode);
+    xferPaint.setBlendMode(mode);
     canvas->saveLayer(&bounds, &xferPaint);
 
     r = bounds;
@@ -101,13 +101,14 @@
     }
 
     void onDraw(SkCanvas* canvas) override {
-        SkXfermode::Mode modes[] = { SkXfermode::kSrcOver_Mode,
-                                     SkXfermode::kDstOver_Mode,
-                                     SkXfermode::kSrcATop_Mode,
-                                     SkXfermode::kDstATop_Mode,
-                                     SkXfermode::kSrcIn_Mode,
-                                     SkXfermode::kDstIn_Mode,
-                                   };
+        SkBlendMode modes[] = {
+            SkBlendMode::kSrcOver,
+            SkBlendMode::kDstOver,
+            SkBlendMode::kSrcATop,
+            SkBlendMode::kDstATop,
+            SkBlendMode::kSrcIn,
+            SkBlendMode::kDstIn,
+        };
         struct {
             const sk_sp<SkShader>& fShader1;
             const sk_sp<SkShader>& fShader2;
diff --git a/gm/modecolorfilters.cpp b/gm/modecolorfilters.cpp
index 50bb27f..ae926ef 100644
--- a/gm/modecolorfilters.cpp
+++ b/gm/modecolorfilters.cpp
@@ -78,7 +78,7 @@
         }
         SkPaint bgPaint;
         bgPaint.setShader(fBmpShader);
-        bgPaint.setXfermodeMode(SkXfermode::kSrc_Mode);
+        bgPaint.setBlendMode(SkBlendMode::kSrc);
 
         sk_sp<SkShader> shaders[] = {
             nullptr,                                   // use a paint color instead of a shader
diff --git a/gm/picture.cpp b/gm/picture.cpp
index 1ea8ada..72d4159 100644
--- a/gm/picture.cpp
+++ b/gm/picture.cpp
@@ -29,7 +29,7 @@
     canvas->drawPath(path, paint);
 
     paint.setColor(0x80FFFFFF);
-    paint.setXfermodeMode(SkXfermode::kPlus_Mode);
+    paint.setBlendMode(SkBlendMode::kPlus);
     canvas->drawRect(SkRect::MakeXYWH(25, 25, 50, 50), paint);
 
     return rec.finishRecordingAsPicture();
diff --git a/gm/plus.cpp b/gm/plus.cpp
index 6a5af61..51ac2cb 100644
--- a/gm/plus.cpp
+++ b/gm/plus.cpp
@@ -37,7 +37,7 @@
 
     // Using Plus on the right should merge the AA of seam together completely covering the red.
     canvas->saveLayer(nullptr, nullptr);
-      p.setXfermodeMode(SkXfermode::kPlus_Mode);
+      p.setBlendMode(SkBlendMode::kPlus);
       canvas->translate(150, 0);
       canvas->drawPath(upperLeft, p);
       canvas->drawPath(bottomRight, p);
diff --git a/gm/srcmode.cpp b/gm/srcmode.cpp
index 0d02cdc..d57b77c 100644
--- a/gm/srcmode.cpp
+++ b/gm/srcmode.cpp
@@ -82,8 +82,8 @@
             draw_hair, draw_thick, draw_rect, draw_oval, draw_text
         };
 
-        const SkXfermode::Mode modes[] = {
-            SkXfermode::kSrcOver_Mode, SkXfermode::kSrc_Mode, SkXfermode::kClear_Mode
+        const SkBlendMode modes[] = {
+            SkBlendMode::kSrcOver, SkBlendMode::kSrc, SkBlendMode::kClear
         };
 
         const PaintProc paintProcs[] = {
@@ -96,7 +96,7 @@
             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.setXfermodeMode(modes[x]);
+                    paint.setBlendMode(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 3974aca..c581e13 100644
--- a/gm/textblobblockreordering.cpp
+++ b/gm/textblobblockreordering.cpp
@@ -69,7 +69,7 @@
         redPaint.setColor(SK_ColorRED);
         canvas->drawRect(bounds, redPaint);
         SkPaint srcInPaint(paint);
-        srcInPaint.setXfermodeMode(SkXfermode::kSrcIn_Mode);
+        srcInPaint.setBlendMode(SkBlendMode::kSrcIn);
         canvas->drawTextBlob(fBlob, 0, 0, srcInPaint);
 
         canvas->translate(SkIntToScalar(xDelta), SkIntToScalar(yDelta));
diff --git a/gm/textbloblooper.cpp b/gm/textbloblooper.cpp
index 3adf349..37eae66 100644
--- a/gm/textbloblooper.cpp
+++ b/gm/textbloblooper.cpp
@@ -51,7 +51,7 @@
 typedef void (*LooperProc)(SkPaint*);
 
 struct LooperSettings {
-    SkXfermode::Mode fMode;
+    SkBlendMode      fMode;
     SkColor          fColor;
     SkPaint::Style   fStyle;
     SkScalar         fWidth;
@@ -120,7 +120,7 @@
     for (size_t i = 0; i < size; i++) {
         info.fOffset.set(settings[i].fOffset, settings[i].fOffset);
         SkPaint* paint = looperBuilder.addLayer(info);
-        paint->setXfermodeMode(settings[i].fMode);
+        paint->setBlendMode(settings[i].fMode);
         paint->setColor(settings[i].fColor);
         paint->setStyle(settings[i].fStyle);
         paint->setStrokeWidth(settings[i].fWidth);
@@ -152,37 +152,37 @@
 
         // create a looper which sandwhiches an effect in two normal draws
         LooperSettings looperSandwhich[] = {
-           { 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 },
+           { 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 },
         };
 
         LooperSettings compound[] = {
-            { 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 }
+            { 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 }
         };
 
         LooperSettings xfermode[] = {
-            { 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 },
+            { 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 },
         };
 
         // NOTE, this should be ignored by textblobs
         LooperSettings skew[] = {
-            { 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 },
+            { 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 },
         };
 
         LooperSettings kitchenSink[] = {
-            { 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 },
+            { 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 },
         };
 
         fLoopers.push_back(setupLooper(SkLayerDrawLooper::kMaskFilter_Bit |
diff --git a/gm/texteffects.cpp b/gm/texteffects.cpp
index 6a5a9c1..453a555 100644
--- a/gm/texteffects.cpp
+++ b/gm/texteffects.cpp
@@ -25,7 +25,7 @@
 
     p.setAlpha(0x11);
     p.setStyle(SkPaint::kFill_Style);
-    p.setXfermodeMode(SkXfermode::kSrc_Mode);
+    p.setBlendMode(SkBlendMode::kSrc);
     rastBuilder->addLayer(p);
 }
 
@@ -33,7 +33,7 @@
     rastBuilder->addLayer(p);
 
     p.setAlpha(0x40);
-    p.setXfermodeMode(SkXfermode::kSrc_Mode);
+    p.setBlendMode(SkBlendMode::kSrc);
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SK_Scalar1*2);
     rastBuilder->addLayer(p);
@@ -46,7 +46,7 @@
 
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SK_Scalar1*3/2);
-    p.setXfermodeMode(SkXfermode::kClear_Mode);
+    p.setBlendMode(SkBlendMode::kClear);
     rastBuilder->addLayer(p);
 }
 
@@ -57,7 +57,7 @@
 
     p.setAlpha(0x20);
     p.setStyle(SkPaint::kFill_Style);
-    p.setXfermodeMode(SkXfermode::kSrc_Mode);
+    p.setBlendMode(SkBlendMode::kSrc);
     rastBuilder->addLayer(p);
 }
 
@@ -66,10 +66,10 @@
     rastBuilder->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
 
     p.setAlpha(0xFF);
-    p.setXfermodeMode(SkXfermode::kClear_Mode);
+    p.setBlendMode(SkBlendMode::kClear);
     rastBuilder->addLayer(p, SK_Scalar1*3/2, SK_Scalar1*3/2);
 
-    p.setXfermode(nullptr);
+    p.setBlendMode(SkBlendMode::kSrcOver);
     rastBuilder->addLayer(p);
 }
 
@@ -79,7 +79,7 @@
     rastBuilder->addLayer(p);
 
     p.setPathEffect(SkDiscretePathEffect::Make(SK_Scalar1*4, SK_Scalar1*3));
-    p.setXfermodeMode(SkXfermode::kSrcOut_Mode);
+    p.setBlendMode(SkBlendMode::kSrcOut);
     rastBuilder->addLayer(p);
 }
 
@@ -90,7 +90,7 @@
     SkLayerRasterizer::Builder rastBuilder2;
     r5(&rastBuilder2, p);
     p.setRasterizer(rastBuilder2.detach());
-    p.setXfermodeMode(SkXfermode::kClear_Mode);
+    p.setBlendMode(SkBlendMode::kClear);
     rastBuilder->addLayer(p);
 }
 
@@ -117,11 +117,11 @@
     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.setXfermodeMode(SkXfermode::kClear_Mode);
+    p.setBlendMode(SkBlendMode::kClear);
     rastBuilder->addLayer(p);
 
     p.setPathEffect(nullptr);
-    p.setXfermode(nullptr);
+    p.setBlendMode(SkBlendMode::kSrcOver);
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SK_Scalar1);
     rastBuilder->addLayer(p);
@@ -134,11 +134,11 @@
     lattice.setScale(SK_Scalar1, SK_Scalar1*6, 0, 0);
     lattice.postRotate(SkIntToScalar(30), 0, 0);
     p.setPathEffect(SkLine2DPathEffect::Make(SK_Scalar1*2, lattice));
-    p.setXfermodeMode(SkXfermode::kClear_Mode);
+    p.setBlendMode(SkBlendMode::kClear);
     rastBuilder->addLayer(p);
 
     p.setPathEffect(nullptr);
-    p.setXfermode(nullptr);
+    p.setBlendMode(SkBlendMode::kSrcOver);
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SK_Scalar1);
     rastBuilder->addLayer(p);
diff --git a/gm/texturedomaineffect.cpp b/gm/texturedomaineffect.cpp
index 2dd340e..b0d2ece 100644
--- a/gm/texturedomaineffect.cpp
+++ b/gm/texturedomaineffect.cpp
@@ -57,14 +57,14 @@
         SkColor colors2[] = { SK_ColorMAGENTA, SK_ColorLTGRAY, SK_ColorYELLOW };
         paint.setShader(SkGradientShader::MakeSweep(45.f, 55.f, colors2, nullptr,
                                                     SK_ARRAY_COUNT(colors2)));
-        paint.setXfermodeMode(SkXfermode::kDarken_Mode);
+        paint.setBlendMode(SkBlendMode::kDarken);
         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.setXfermodeMode(SkXfermode::kLighten_Mode);
+        paint.setBlendMode(SkBlendMode::kLighten);
         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 f257bf9..9f1c05f 100644
--- a/gm/verylargebitmap.cpp
+++ b/gm/verylargebitmap.cpp
@@ -18,7 +18,7 @@
     SkPaint paint;
     paint.setShader(SkGradientShader::MakeRadial(center, radius, colors, nullptr, 2,
                                                  SkShader::kMirror_TileMode));
-    paint.setXfermodeMode(SkXfermode::kSrc_Mode);
+    paint.setBlendMode(SkBlendMode::kSrc);
     canvas->drawPaint(paint);
 }
 
diff --git a/gm/xfermodeimagefilter.cpp b/gm/xfermodeimagefilter.cpp
index a0677c7..9190859 100644
--- a/gm/xfermodeimagefilter.cpp
+++ b/gm/xfermodeimagefilter.cpp
@@ -48,46 +48,45 @@
         SkPaint paint;
 
         const struct {
-            SkXfermode::Mode  fMode;
-            const char*         fLabel;
+            SkBlendMode fMode;
+            const char* fLabel;
         } gModes[] = {
-            { 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"       },
+            { 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::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"    },
+            { 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"    },
         };
 
         int x = 0, y = 0;
         sk_sp<SkImageFilter> background(SkImageSource::Make(fCheckerboard));
         for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) {
-            paint.setImageFilter(SkXfermodeImageFilter::Make(SkXfermode::Make(gModes[i].fMode),
-                                                             background));
+            paint.setImageFilter(SkXfermodeImageFilter::Make(gModes[i].fMode, background));
             DrawClippedBitmap(canvas, fBitmap, paint, x, y);
             x += fBitmap.width() + MARGIN;
             if (x + fBitmap.width() > WIDTH) {
@@ -104,7 +103,7 @@
             y += fBitmap.height() + MARGIN;
         }
         // Test nullptr mode
-        paint.setImageFilter(SkXfermodeImageFilter::Make(nullptr, background));
+        paint.setImageFilter(SkXfermodeImageFilter::Make(SkBlendMode::kSrcOver, background));
         DrawClippedBitmap(canvas, fBitmap, paint, x, y);
         x += fBitmap.width() + MARGIN;
         if (x + fBitmap.width() > WIDTH) {
@@ -122,11 +121,10 @@
         sk_sp<SkImageFilter> offsetBackground(SkOffsetImageFilter::Make(SkIntToScalar(4),
                                                                         SkIntToScalar(4),
                                                                         background));
-        paint.setImageFilter(SkXfermodeImageFilter::Make(
-                                                     SkXfermode::Make(SkXfermode::kSrcOver_Mode),
-                                                     offsetBackground,
-                                                     offsetForeground,
-                                                     nullptr));
+        paint.setImageFilter(SkXfermodeImageFilter::Make(SkBlendMode::kSrcOver,
+                                                         offsetBackground,
+                                                         offsetForeground,
+                                                         nullptr));
         DrawClippedPaint(canvas, clipRect, paint, x, y);
         x += fBitmap.width() + MARGIN;
         if (x + fBitmap.width() > WIDTH) {
@@ -134,7 +132,7 @@
             y += fBitmap.height() + MARGIN;
         }
         // Test offsets on Darken (uses shader blend)
-        paint.setImageFilter(SkXfermodeImageFilter::Make(SkXfermode::Make(SkXfermode::kDarken_Mode),
+        paint.setImageFilter(SkXfermodeImageFilter::Make(SkBlendMode::kDarken,
                                                          offsetBackground,
                                                          offsetForeground,
                                                          nullptr));
@@ -146,9 +144,9 @@
         }
         // Test cropping
         constexpr size_t nbSamples = 3;
-        SkXfermode::Mode sampledModes[nbSamples] = {SkXfermode::kOverlay_Mode,
-                                                    SkXfermode::kSrcOver_Mode,
-                                                    SkXfermode::kPlus_Mode};
+        const SkBlendMode sampledModes[nbSamples] = {
+            SkBlendMode::kOverlay, SkBlendMode::kSrcOver, SkBlendMode::kPlus
+        };
         int offsets[nbSamples][4] = {{ 10,  10, -16, -16},
                                      { 10,  10,  10,  10},
                                      {-10, -10,  -6,  -6}};
@@ -158,7 +156,7 @@
                                                  fBitmap.width()  + offsets[i][2],
                                                  fBitmap.height() + offsets[i][3]);
             SkImageFilter::CropRect rect(SkRect::Make(cropRect));
-            paint.setImageFilter(SkXfermodeImageFilter::Make(SkXfermode::Make(sampledModes[i]),
+            paint.setImageFilter(SkXfermodeImageFilter::Make(sampledModes[i],
                                                              offsetBackground,
                                                              offsetForeground,
                                                              &rect));
@@ -170,7 +168,7 @@
             }
         }
         // Test small bg, large fg with Screen (uses shader blend)
-        auto mode = SkXfermode::Make(SkXfermode::kScreen_Mode);
+        SkBlendMode mode = SkBlendMode::kScreen;
         SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(10, 10, 60, 60));
         sk_sp<SkImageFilter> cropped(SkOffsetImageFilter::Make(0, 0, foreground, &cropRect));
         paint.setImageFilter(SkXfermodeImageFilter::Make(mode, cropped, background, nullptr));
@@ -191,7 +189,7 @@
         // 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 = SkXfermode::Make(SkXfermode::kSrcIn_Mode);
+        mode = SkBlendMode::kSrcIn;
         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 8fbbdbe..604a767 100644
--- a/gm/xfermodes.cpp
+++ b/gm/xfermodes.cpp
@@ -34,45 +34,45 @@
 };
 
 const struct {
-    SkXfermode::Mode  fMode;
-    const char*       fLabel;
-    int               fSourceTypeMask;  // The source types to use this
+    SkBlendMode 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[] = {
-    { 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   },
+    { 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   },
 
-    { 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 },
+    { 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 },
 };
 
 static void make_bitmaps(int w, int h, SkBitmap* src, SkBitmap* dst,
@@ -118,15 +118,14 @@
      * uses the implied shape of the drawing command and these modes
      * demonstrate that.
      */
-    void draw_mode(SkCanvas* canvas, SkXfermode::Mode mode, SrcType srcType,
-                   SkScalar x, SkScalar y) {
+    void draw_mode(SkCanvas* canvas, SkBlendMode 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.setXfermodeMode(mode);
+        p.setBlendMode(mode);
         switch (srcType) {
             case kSmallTransparentImage_SrcType: {
                 m.postScale(SK_ScalarHalf, SK_ScalarHalf, x, y);
@@ -141,7 +140,7 @@
                                                  SkIntToScalar(H));
                 canvas->saveLayer(&bounds, &p);
                 restoreNeeded = true;
-                p.setXfermodeMode(SkXfermode::kSrcOver_Mode);
+                p.setBlendMode(SkBlendMode::kSrcOver);
                 // Fall through.
             }
             case kQuarterClear_SrcType: {
diff --git a/gm/xfermodes2.cpp b/gm/xfermodes2.cpp
index 6f7d054..03da0d3 100644
--- a/gm/xfermodes2.cpp
+++ b/gm/xfermodes2.cpp
@@ -40,7 +40,7 @@
 
         SkScalar x = 0, y = 0;
         for (size_t m = 0; m <= SkXfermode::kLastMode; m++) {
-            SkXfermode::Mode mode = static_cast<SkXfermode::Mode>(m);
+            SkBlendMode mode = static_cast<SkBlendMode>(m);
 
             canvas->save();
 
@@ -57,7 +57,7 @@
             p.setShader(fDst);
             canvas->drawRect(r, p);
             p.setShader(fSrc);
-            p.setXfermode(SkXfermode::Make(mode));
+            p.setBlendMode(mode);
             canvas->drawRect(r, p);
 
             canvas->restore();
@@ -65,7 +65,7 @@
             r.inset(-SK_ScalarHalf, -SK_ScalarHalf);
             p.setStyle(SkPaint::kStroke_Style);
             p.setShader(nullptr);
-            p.setXfermode(nullptr);
+            p.setBlendMode(SkBlendMode::kSrcOver);
             canvas->drawRect(r, p);
 
             canvas->restore();
diff --git a/gm/xfermodes3.cpp b/gm/xfermodes3.cpp
index 300b78f..36702bf 100644
--- a/gm/xfermodes3.cpp
+++ b/gm/xfermodes3.cpp
@@ -69,7 +69,7 @@
         };
         for (size_t s = 0; s < SK_ARRAY_COUNT(kStrokes); ++s) {
             for (size_t m = 0; m <= SkXfermode::kLastMode; ++m) {
-                SkXfermode::Mode mode = static_cast<SkXfermode::Mode>(m);
+                SkBlendMode mode = static_cast<SkBlendMode>(m);
                 canvas->drawText(SkXfermode::ModeName(mode),
                                  strlen(SkXfermode::ModeName(mode)),
                                  SkIntToScalar(x),
@@ -77,7 +77,7 @@
                                  labelP);
                 for (size_t c = 0; c < SK_ARRAY_COUNT(kSolidColors); ++c) {
                     SkPaint modePaint;
-                    modePaint.setXfermodeMode(mode);
+                    modePaint.setBlendMode(mode);
                     modePaint.setColor(kSolidColors[c]);
                     modePaint.setStyle(kStrokes[s].fStyle);
                     modePaint.setStrokeWidth(kStrokes[s].fWidth);
@@ -93,7 +93,7 @@
                 }
                 for (size_t a = 0; a < SK_ARRAY_COUNT(kBmpAlphas); ++a) {
                     SkPaint modePaint;
-                    modePaint.setXfermodeMode(mode);
+                    modePaint.setBlendMode(mode);
                     modePaint.setAlpha(kBmpAlphas[a]);
                     modePaint.setShader(fBmpShader);
                     modePaint.setStyle(kStrokes[s].fStyle);