remove xfermode from public api
authorMike Reed <reed@google.com>
Fri, 28 Oct 2016 19:42:34 +0000 (15:42 -0400)
committerSkia Commit-Bot <skia-commit-bot@chromium.org>
Fri, 28 Oct 2016 20:06:17 +0000 (20:06 +0000)
BUG=skia:

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

CQ_INCLUDE_TRYBOTS=master.client.skia:Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-SKNX_NO_SIMD-Trybot

Change-Id: I19cd056f2af778f10e8c6c2b7b2735593b43dbac
Reviewed-on: https://skia-review.googlesource.com/4020
Reviewed-by: Florin Malita <fmalita@chromium.org>
Reviewed-by: Mike Klein <mtklein@chromium.org>
Commit-Queue: Mike Reed <reed@google.com>

151 files changed:
bench/BlurRoundRectBench.cpp
bench/ColorFilterBench.cpp
bench/GameBench.cpp
bench/ImageFilterDAGBench.cpp
bench/MergeBench.cpp
bench/PatchBench.cpp
bench/PatchGridBench.cpp
bench/RectoriBench.cpp
bench/VertBench.cpp
fuzz/FilterFuzz.cpp
gm/beziereffects.cpp
gm/bigrrectaaeffect.cpp
gm/blurredclippedcircle.cpp
gm/blurroundrect.cpp
gm/color4f.cpp
gm/colorfilterimagefilter.cpp
gm/composeshader.cpp
gm/convexpolyeffect.cpp
gm/drawatlas.cpp
gm/drawatlascolor.cpp
gm/drawlooper.cpp
gm/dropshadowimagefilter.cpp
gm/emboss.cpp
gm/gamut.cpp
gm/imagefiltersbase.cpp
gm/imagefilterscropped.cpp
gm/imagefiltersgraph.cpp
gm/imagemakewithfilter.cpp
gm/megalooper.cpp
gm/modecolorfilters.cpp
gm/multipicturedraw.cpp
gm/patch.cpp
gm/patchgrid.cpp
gm/rrects.cpp
gm/skbug1719.cpp
gm/tablecolorfilter.cpp
gm/texdata.cpp
gm/textbloblooper.cpp
gm/texturedomaineffect.cpp
gm/tileimagefilter.cpp
gm/vertices.cpp
gm/yuvtorgbeffect.cpp
gn/android_framework_defines.gni
include/core/SkBitmapDevice.h
include/core/SkCanvas.h
include/core/SkColorFilter.h
include/core/SkDevice.h
include/core/SkDraw.h
include/core/SkPicture.h
include/core/SkShader.h
include/core/SkTypes.h
include/core/SkXfermode.h
include/effects/SkLayerDrawLooper.h
include/effects/SkMergeImageFilter.h
include/gpu/GrPaint.h
include/gpu/effects/GrCustomXfermode.h
include/gpu/effects/GrPorterDuffXferProcessor.h
include/gpu/effects/GrXfermodeFragmentProcessor.h
include/private/SkRecords.h
include/utils/SkDumpCanvas.h
include/utils/SkLuaCanvas.h
include/utils/SkNWayCanvas.h
include/utils/SkPaintFilterCanvas.h
public.bzl
samplecode/PerlinPatch.cpp
samplecode/SampleAll.cpp
samplecode/SampleAtlas.cpp
samplecode/SampleColorFilter.cpp
samplecode/SampleFilterFuzz.cpp
samplecode/SamplePatch.cpp
samplecode/SampleShaders.cpp
samplecode/SampleShip.cpp
samplecode/SampleSlides.cpp
samplecode/SampleVertices.cpp
src/core/SkBitmapDevice.cpp
src/core/SkCanvas.cpp
src/core/SkColorFilter.cpp
src/core/SkComposeShader.cpp
src/core/SkComposeShader.h
src/core/SkDevice.cpp
src/core/SkDraw.cpp
src/core/SkLiteDL.cpp
src/core/SkLiteDL.h
src/core/SkLiteRecorder.cpp
src/core/SkLiteRecorder.h
src/core/SkModeColorFilter.cpp
src/core/SkModeColorFilter.h
src/core/SkOpts.h
src/core/SkPicturePlayback.cpp
src/core/SkPictureRecord.cpp
src/core/SkPictureRecord.h
src/core/SkReadBuffer.h
src/core/SkRecordDraw.cpp
src/core/SkRecorder.cpp
src/core/SkRecorder.h
src/core/SkValidationUtils.h
src/core/SkXfermode.cpp
src/core/SkXfermode_proccoeff.h
src/effects/SkBlurDrawLooper.cpp
src/effects/SkColorMatrixFilter.cpp
src/effects/SkDropShadowImageFilter.cpp
src/effects/SkLayerDrawLooper.cpp
src/effects/SkMergeImageFilter.cpp
src/effects/SkXfermodeImageFilter.cpp
src/gpu/GrFragmentProcessor.cpp
src/gpu/GrRenderTargetContext.cpp
src/gpu/SkGpuDevice.cpp
src/gpu/SkGpuDevice.h
src/gpu/SkGr.cpp
src/gpu/SkGrPriv.h
src/gpu/effects/GrCustomXfermode.cpp
src/gpu/effects/GrPorterDuffXferProcessor.cpp
src/gpu/effects/GrXfermodeFragmentProcessor.cpp
src/gpu/glsl/GrGLSLBlend.cpp
src/gpu/glsl/GrGLSLBlend.h
src/image/SkImage_Gpu.cpp
src/opts/SkXfermode_opts.h
src/pdf/SkPDFDevice.cpp
src/pdf/SkPDFDevice.h
src/pipe/SkPipeCanvas.cpp
src/pipe/SkPipeCanvas.h
src/pipe/SkPipeReader.cpp
src/svg/SkSVGDevice.cpp
src/svg/SkSVGDevice.h
src/utils/SkDeferredCanvas.cpp
src/utils/SkDeferredCanvas.h
src/utils/SkDumpCanvas.cpp
src/utils/SkLua.cpp
src/utils/SkLuaCanvas.cpp
src/utils/SkMeshUtils.cpp
src/utils/SkNWayCanvas.cpp
src/utils/SkPaintFilterCanvas.cpp
src/utils/SkPatchGrid.cpp
src/utils/SkPatchGrid.h
src/xps/SkXPSDevice.cpp
src/xps/SkXPSDevice.h
tests/BlitRowTest.cpp
tests/BlurTest.cpp
tests/CanvasTest.cpp
tests/ColorFilterTest.cpp
tests/DFPathRendererTest.cpp
tests/GLProgramsTest.cpp
tests/GpuColorFilterTest.cpp
tests/GrPorterDuffTest.cpp
tests/ImageFilterTest.cpp
tests/SRGBMipMapTest.cpp
tests/TessellatingPathRendererTests.cpp
tools/debugger/SkDebugCanvas.cpp
tools/debugger/SkDebugCanvas.h
tools/debugger/SkDrawCommand.cpp
tools/debugger/SkDrawCommand.h

index 713996c..123e889 100644 (file)
@@ -45,7 +45,7 @@ public:
             SkLayerDrawLooper::LayerInfo info;
             info.fPaintBits = SkLayerDrawLooper::kMaskFilter_Bit
                               | SkLayerDrawLooper::kColorFilter_Bit;
-            info.fColorMode = SkXfermode::kSrc_Mode;
+            info.fColorMode = (SK_XFERMODE_MODE_PARAM)SkBlendMode::kSrc;
             info.fOffset = SkPoint::Make(SkIntToScalar(-1), SkIntToScalar(0));
             info.fPostTranslate = false;
             SkPaint* paint = looperBuilder.addLayerOnTop(info);
@@ -53,7 +53,7 @@ public:
                                                         SkBlurMask::ConvertRadiusToSigma(0.5),
                                                         SkBlurMaskFilter::kHighQuality_BlurFlag));
             paint->setColorFilter(SkColorFilter::MakeModeFilter(SK_ColorLTGRAY,
-                                                                SkXfermode::kSrcIn_Mode));
+                                                                SkBlendMode::kSrcIn));
             paint->setColor(SK_ColorGRAY);
         }
         {
index 7d942ce..40ec644 100644 (file)
@@ -37,8 +37,7 @@ static sk_sp<SkImageFilter> make_grayscale(sk_sp<SkImageFilter> input) {
 }
 
 static sk_sp<SkImageFilter> make_mode_blue(sk_sp<SkImageFilter> input) {
-    sk_sp<SkColorFilter> filter(SkColorFilter::MakeModeFilter(SK_ColorBLUE,
-                                                              SkXfermode::kSrcIn_Mode));
+    sk_sp<SkColorFilter> filter(SkColorFilter::MakeModeFilter(SK_ColorBLUE, SkBlendMode::kSrcIn));
     return SkColorFilterImageFilter::Make(std::move(filter), std::move(input));
 }
 
index 84da73e..9b811f0 100644 (file)
@@ -201,8 +201,7 @@ protected:
                         { SkIntToScalar(src.fRight), SkIntToScalar(src.fBottom) },
                     };
                     canvas->drawVertices(SkCanvas::kTriangles_VertexMode,
-                                         4, verts, uvs, nullptr, nullptr,
-                                         indices, 6, p2);
+                                         4, verts, uvs, nullptr, indices, 6, p2);
                 } else {
                     canvas->drawBitmapRect(fAtlas, src, dst, &p,
                                            SkCanvas::kFast_SrcRectConstraint);
index 60bcb62..719e87b 100644 (file)
@@ -31,11 +31,13 @@ protected:
         for (int j = 0; j < loops; j++) {
             sk_sp<SkImageFilter> blur(SkBlurImageFilter::Make(20.0f, 20.0f, nullptr));
             sk_sp<SkImageFilter> inputs[kNumInputs];
+            SkBlendMode modes[kNumInputs];
             for (int i = 0; i < kNumInputs; ++i) {
                 inputs[i] = blur;
+                modes[i] = SkBlendMode::kSrcOver;
             }
             SkPaint paint;
-            paint.setImageFilter(SkMergeImageFilter::Make(inputs, kNumInputs));
+            paint.setImageFilter(SkMergeImageFilter::MakeN(inputs, kNumInputs, modes));
             canvas->drawRect(rect, paint);
         }
     }
@@ -68,10 +70,12 @@ protected:
         for (int j = 0; j < loops; j++) {
             sk_sp<SkImageFilter> blur(SkBlurImageFilter::Make(20.0f, 20.0f, nullptr));
             sk_sp<SkImageFilter> inputs[kNumInputs];
+            SkBlendMode modes[kNumInputs];
             for (int i = 0; i < kNumInputs; ++i) {
                 inputs[i] = blur;
+                modes[i] = SkBlendMode::kSrcOver;
             }
-            sk_sp<SkImageFilter> mergeFilter = SkMergeImageFilter::Make(inputs, kNumInputs);
+            sk_sp<SkImageFilter> mergeFilter = SkMergeImageFilter::MakeN(inputs, kNumInputs, modes);
             image = image->makeWithFilter(mergeFilter.get(), subset, subset, &discardSubset,
                                           &offset);
             SkASSERT(image && image->dimensions() == fImage->dimensions());
index 70b4744..8b6004d 100644 (file)
@@ -81,7 +81,7 @@ protected:
 private:
     sk_sp<SkImageFilter> mergeBitmaps() {
         return SkMergeImageFilter::Make(SkImageSource::Make(fCheckerboard),
-                                        SkImageSource::Make(fImage));
+                                        SkImageSource::Make(fImage), SkBlendMode::kSrcOver);
     }
 
     bool fIsSmall;
index f029584..d1d253b 100644 (file)
@@ -127,16 +127,16 @@ protected:
         for (int i = 0; i < loops; i++) {
             switch (fVertexMode) {
                 case kNone_VertexMode:
-                    canvas->drawPatch(fCubics, nullptr, nullptr, nullptr, fPaint);
+                    canvas->drawPatch(fCubics, nullptr, nullptr, fPaint);
                     break;
                 case kColors_VertexMode:
-                    canvas->drawPatch(fCubics, fColors, nullptr, nullptr, fPaint);
+                    canvas->drawPatch(fCubics, fColors, nullptr, fPaint);
                     break;
                 case kTexCoords_VertexMode:
-                    canvas->drawPatch(fCubics, nullptr, fTexCoords, nullptr, fPaint);
+                    canvas->drawPatch(fCubics, nullptr, fTexCoords, fPaint);
                     break;
                 case kBoth_VertexMode:
-                    canvas->drawPatch(fCubics, fColors, fTexCoords, nullptr, fPaint);
+                    canvas->drawPatch(fCubics, fColors, fTexCoords, fPaint);
                     break;
                 default:
                     break;
index db7865b..9892658 100644 (file)
@@ -96,7 +96,7 @@ public:
         static const int kRows = 3;
         static const int kCols = 4;
 
-        fGrid.reset(kRows, kCols, SkPatchGrid::kColors_VertexType, nullptr);
+        fGrid.reset(kRows, kCols, SkPatchGrid::kColors_VertexType, SkBlendMode::kModulate);
         for (int i = 0; i < kRows; i++) {
             for (int j = 0; j < kCols; j++) {
                 SkPoint points[12];
index ad3d4c2..86304ae 100644 (file)
@@ -80,7 +80,7 @@ private:
         // TODO: add a color filter to better match what is seen in the wild
         info.fPaintBits = /* SkLayerDrawLooper::kColorFilter_Bit |*/
                           SkLayerDrawLooper::kMaskFilter_Bit;
-        info.fColorMode = SkXfermode::kDst_Mode;
+        info.fColorMode = (SK_XFERMODE_MODE_PARAM)SkBlendMode::kDst;
         info.fOffset.set(xOff, 0);
         info.fPostTranslate = false;
 
index daff26e..0744f94 100644 (file)
@@ -83,7 +83,7 @@ protected:
 
         for (int i = 0; i < loops; i++) {
             canvas->drawVertices(SkCanvas::kTriangles_VertexMode, PTS,
-                                 fPts, nullptr, fColors, nullptr, fIdx, IDX, paint);
+                                 fPts, nullptr, fColors, fIdx, IDX, paint);
         }
     }
 private:
index e6f9cb3..ed47d06 100644 (file)
@@ -369,7 +369,7 @@ static sk_sp<SkColorFilter> 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_blendmode());
         case 4:
             return SkColorMatrixFilter::MakeLightingFilter(make_color(), make_color());
         case 5:
@@ -554,7 +554,7 @@ static sk_sp<SkImageFilter> make_image_filter(bool canBeNull) {
     case MERGE:
         filter = SkMergeImageFilter::Make(make_image_filter(),
                                           make_image_filter(),
-                                          (SkXfermode::Mode)make_blendmode());
+                                          make_blendmode());
         break;
     case COLOR: {
         sk_sp<SkColorFilter> cf(make_color_filter());
index 0005857..6c0049b 100644 (file)
@@ -190,7 +190,7 @@ protected:
                     canvas->drawRect(bounds, boundsPaint);
 
                     GrPaint grPaint;
-                    grPaint.setXPFactory(GrPorterDuffXPFactory::Make(SkXfermode::kSrc_Mode));
+                    grPaint.setXPFactory(GrPorterDuffXPFactory::Make(SkBlendMode::kSrc));
 
                     SkAutoTUnref<GrDrawBatch> batch(
                         new BezierCubicOrConicTestBatch(gp, bounds, color, klmEqs, klmSigns[c]));
@@ -322,7 +322,7 @@ protected:
                     canvas->drawRect(bounds, boundsPaint);
 
                     GrPaint grPaint;
-                    grPaint.setXPFactory(GrPorterDuffXPFactory::Make(SkXfermode::kSrc_Mode));
+                    grPaint.setXPFactory(GrPorterDuffXPFactory::Make(SkBlendMode::kSrc));
 
                     SkAutoTUnref<GrDrawBatch> batch(
                         new BezierCubicOrConicTestBatch(gp, bounds, color, klmEqs, 1.f));
@@ -532,7 +532,7 @@ protected:
                     canvas->drawRect(bounds, boundsPaint);
 
                     GrPaint grPaint;
-                    grPaint.setXPFactory(GrPorterDuffXPFactory::Make(SkXfermode::kSrc_Mode));
+                    grPaint.setXPFactory(GrPorterDuffXPFactory::Make(SkBlendMode::kSrc));
 
                     GrPathUtils::QuadUVMatrix DevToUV(pts);
 
index 82ba7cb..be37d70 100644 (file)
@@ -75,7 +75,7 @@ protected:
                 canvas->drawRect(testBounds, paint);
 
                 GrPaint grPaint;
-                grPaint.setXPFactory(GrPorterDuffXPFactory::Make(SkXfermode::kSrc_Mode));
+                grPaint.setXPFactory(GrPorterDuffXPFactory::Make(SkBlendMode::kSrc));
 
                 SkRRect rrect = fRRect;
                 rrect.offset(SkIntToScalar(x + kGap), SkIntToScalar(y + kGap));
index a0359c3..e2cb288 100644 (file)
@@ -69,7 +69,7 @@ protected:
                                             SkBlurMaskFilter::kHighQuality_BlurFlag));
                     paint.setColorFilter(SkColorFilter::MakeModeFilter(
                                              SK_ColorRED,
-                                             SkXfermode::kSrcIn_Mode));
+                                             SkBlendMode::kSrcIn));
                     paint.setAntiAlias(true);
 
                     canvas->drawRRect(rr, paint);
index 5982d06..8e5b89d 100644 (file)
@@ -51,7 +51,7 @@ public:
             SkLayerDrawLooper::LayerInfo info;
             info.fPaintBits = SkLayerDrawLooper::kMaskFilter_Bit
                               | SkLayerDrawLooper::kColorFilter_Bit;
-            info.fColorMode = SkXfermode::kSrc_Mode;
+            info.fColorMode = (SK_XFERMODE_MODE_PARAM)SkBlendMode::kSrc;
             info.fOffset = SkPoint::Make(SkIntToScalar(-1), SkIntToScalar(0));
             info.fPostTranslate = false;
             SkPaint* paint = looperBuilder.addLayerOnTop(info);
@@ -61,7 +61,7 @@ public:
                     SkBlurMaskFilter::kHighQuality_BlurFlag));
             paint->setColorFilter(SkColorFilter::MakeModeFilter(
                     sk_tool_utils::color_to_565(SK_ColorLTGRAY),
-                    SkXfermode::kSrcIn_Mode));
+                    SkBlendMode::kSrcIn));
             paint->setColor(sk_tool_utils::color_to_565(SK_ColorGRAY));
         }
         {
index c1535cc..b5cda9f 100644 (file)
@@ -47,7 +47,7 @@ static sk_sp<SkColorFilter> make_cf1() {
 }
 
 static sk_sp<SkColorFilter> make_cf2() {
-    return SkColorFilter::MakeModeFilter(0x8044CC88, SkXfermode::kSrcATop_Mode);
+    return SkColorFilter::MakeModeFilter(0x8044CC88, SkBlendMode::kSrcATop);
 }
 
 static void draw_into_canvas(SkCanvas* canvas) {
index 7b54e5e..6e07ed3 100644 (file)
@@ -39,7 +39,7 @@ static sk_sp<SkColorFilter> cf_make_grayscale() {
 }
 
 static sk_sp<SkColorFilter> cf_make_colorize(SkColor color) {
-    return SkColorFilter::MakeModeFilter(color, SkXfermode::kSrc_Mode);
+    return SkColorFilter::MakeModeFilter(color, SkBlendMode::kSrc);
 }
 
 static void sk_gm_get_colorfilters(SkTArray<sk_sp<SkColorFilter>>* array) {
index b58f91f..785f2bf 100644 (file)
@@ -14,7 +14,7 @@
 #include "SkString.h"
 #include "SkXfermode.h"
 
-static sk_sp<SkShader> make_shader(SkXfermode::Mode mode) {
+static sk_sp<SkShader> make_shader(SkBlendMode mode) {
     SkPoint pts[2];
     SkColor colors[2];
 
@@ -30,14 +30,13 @@ static sk_sp<SkShader> make_shader(SkXfermode::Mode mode) {
     colors[1] = SkColorSetARGB(0x80, 0, 0, 0);
     auto shaderB = SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
 
-    return SkShader::MakeComposeShader(std::move(shaderA), std::move(shaderB),
-                                       SkXfermode::Make(mode));
+    return SkShader::MakeComposeShader(std::move(shaderA), std::move(shaderB), mode);
 }
 
 class ComposeShaderGM : public skiagm::GM {
 public:
     ComposeShaderGM() {
-        fShader = make_shader(SkXfermode::kDstIn_Mode);
+        fShader = make_shader(SkBlendMode::kDstIn);
     }
 
 protected:
@@ -79,8 +78,8 @@ protected:
 
     void onDraw(SkCanvas* canvas) override {
         sk_sp<SkShader> shaders[] = {
-            make_shader(SkXfermode::kDstIn_Mode),
-            make_shader(SkXfermode::kSrcOver_Mode),
+            make_shader(SkBlendMode::kDstIn),
+            make_shader(SkBlendMode::kSrcOver),
         };
 
         SkPaint paint;
@@ -175,13 +174,13 @@ protected:
     }
 
     void onDraw(SkCanvas* canvas) override {
-        auto xfer(SkXfermode::Make(SkXfermode::kDstOver_Mode));
+        SkBlendMode mode = SkBlendMode::kDstOver;
 
         sk_sp<SkShader> shaders[] = {
             // gradient should appear over color bitmap
-            SkShader::MakeComposeShader(fLinearGradientShader, fColorBitmapShader, xfer),
+            SkShader::MakeComposeShader(fLinearGradientShader, fColorBitmapShader, mode),
             // gradient should appear over alpha8 bitmap colorized by the paint color
-            SkShader::MakeComposeShader(fLinearGradientShader, fAlpha8BitmapShader, xfer),
+            SkShader::MakeComposeShader(fLinearGradientShader, fAlpha8BitmapShader, mode),
         };
 
         SkPaint paint;
@@ -253,9 +252,8 @@ DEF_SIMPLE_GM(composeshader_bitmap2, canvas, 200, 200) {
     sk_sp<SkImage> skMaskImage = SkImage::MakeFromBitmap(skMask);
     sk_sp<SkShader> skMaskShader = skMaskImage->makeShader(
         SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
-    sk_sp<SkXfermode> dstInMode = SkXfermode::Make(SkXfermode::kSrcIn_Mode);
     paint.setShader(
-        SkShader::MakeComposeShader(skMaskShader, skSrcShader, dstInMode));
+        SkShader::MakeComposeShader(skMaskShader, skSrcShader, SkBlendMode::kSrcIn));
     canvas->drawRect(r, paint);
 }
 
index f169639..d62838d 100644 (file)
@@ -180,7 +180,7 @@ protected:
                 }
 
                 GrPaint grPaint;
-                grPaint.setXPFactory(GrPorterDuffXPFactory::Make(SkXfermode::kSrc_Mode));
+                grPaint.setXPFactory(GrPorterDuffXPFactory::Make(SkBlendMode::kSrc));
                 grPaint.addCoverageFragmentProcessor(std::move(fp));
 
                 SkAutoTUnref<GrDrawBatch> batch(new PolyBoundsBatch(p.getBounds(), 0xff000000));
@@ -219,7 +219,7 @@ protected:
                 }
 
                 GrPaint grPaint;
-                grPaint.setXPFactory(GrPorterDuffXPFactory::Make(SkXfermode::kSrc_Mode));
+                grPaint.setXPFactory(GrPorterDuffXPFactory::Make(SkBlendMode::kSrc));
                 grPaint.addCoverageFragmentProcessor(std::move(fp));
 
                 SkAutoTUnref<GrDrawBatch> batch(new PolyBoundsBatch(rect, 0xff000000));
index 43b103c..c098e15 100644 (file)
@@ -89,7 +89,7 @@ protected:
 
         canvas->drawAtlas(atlas.get(), xform, tex, N, nullptr, &paint);
         canvas->translate(0, 100);
-        canvas->drawAtlas(atlas.get(), xform, tex, colors, N, SkXfermode::kSrcIn_Mode, nullptr, &paint);
+        canvas->drawAtlas(atlas.get(), xform, tex, colors, N, SkBlendMode::kSrcIn, nullptr, &paint);
     }
 
 private:
index bf76c48..990bdcb 100644 (file)
@@ -75,38 +75,38 @@ protected:
         auto atlas = make_atlas(canvas, kAtlasSize);
 
         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,   "Mod"       },
-            { SkXfermode::kScreen_Mode,     "Screen"    },
-            { SkXfermode::kOverlay_Mode,    "Overlay"   },
-            { SkXfermode::kDarken_Mode,     "Darken"    },
-            { SkXfermode::kLighten_Mode,    "Lighten"   },
-            { SkXfermode::kColorDodge_Mode, "Dodge"     },
-            { SkXfermode::kColorBurn_Mode,  "Burn"      },
-            { SkXfermode::kHardLight_Mode,  "Hard"      },
-            { SkXfermode::kSoftLight_Mode,  "Soft"      },
-            { SkXfermode::kDifference_Mode, "Diff"      },
-            { SkXfermode::kExclusion_Mode,  "Exclusion" },
-            { SkXfermode::kMultiply_Mode,   "Multiply"  },
-            { SkXfermode::kHue_Mode,        "Hue"       },
-            { SkXfermode::kSaturation_Mode, "Sat"       },
-            { 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,   "Mod"       },
+            { SkBlendMode::kScreen,     "Screen"    },
+            { SkBlendMode::kOverlay,    "Overlay"   },
+            { SkBlendMode::kDarken,     "Darken"    },
+            { SkBlendMode::kLighten,    "Lighten"   },
+            { SkBlendMode::kColorDodge, "Dodge"     },
+            { SkBlendMode::kColorBurn,  "Burn"      },
+            { SkBlendMode::kHardLight,  "Hard"      },
+            { SkBlendMode::kSoftLight,  "Soft"      },
+            { SkBlendMode::kDifference, "Diff"      },
+            { SkBlendMode::kExclusion,  "Exclusion" },
+            { SkBlendMode::kMultiply,   "Multiply"  },
+            { SkBlendMode::kHue,        "Hue"       },
+            { SkBlendMode::kSaturation, "Sat"       },
+            { SkBlendMode::kColor,      "Color"     },
+            { SkBlendMode::kLuminosity, "Luminosity"},
         };
 
         SkColor gColors[] = {
index df8256f..8275939 100644 (file)
@@ -73,7 +73,7 @@ private:
 
         SkLayerDrawLooper::LayerInfo info;
         info.fPaintBits = SkLayerDrawLooper::kStyle_Bit | SkLayerDrawLooper::kMaskFilter_Bit;
-        info.fColorMode = SkXfermode::kSrc_Mode;
+        info.fColorMode = (SK_XFERMODE_MODE_PARAM)SkBlendMode::kSrc;
 
         for (size_t i = 0; i < SK_ARRAY_COUNT(gParams); i++) {
             info.fOffset.set(gParams[i].fOffset, gParams[i].fOffset);
index 370b569..fff318e 100644 (file)
@@ -87,7 +87,7 @@ protected:
         };
 
         sk_sp<SkColorFilter> cf(SkColorFilter::MakeModeFilter(SK_ColorMAGENTA,
-                                                              SkXfermode::kSrcIn_Mode));
+                                                              SkBlendMode::kSrcIn));
         sk_sp<SkImageFilter> cfif(SkColorFilterImageFilter::Make(std::move(cf), nullptr));
         SkImageFilter::CropRect cropRect(SkRect::Make(SkIRect::MakeXYWH(10, 10, 44, 44)),
                                          SkImageFilter::CropRect::kHasAll_CropEdge);
index e7c5800..c4c6209 100644 (file)
@@ -49,7 +49,7 @@ protected:
 
         // this combination of emboss+colorfilter used to crash -- so we exercise it to
         // confirm that we have a fix.
-        paint.setColorFilter(SkColorFilter::MakeModeFilter(0xFFFF0000, SkXfermode::kSrcATop_Mode));
+        paint.setColorFilter(SkColorFilter::MakeModeFilter(0xFFFF0000, SkBlendMode::kSrcATop));
         canvas->translate(bm.width() + SkIntToScalar(10), 0);
         canvas->drawBitmap(bm, 10, 10, &paint);
     }
index a54214e..9f45d6e 100644 (file)
@@ -104,7 +104,7 @@ struct VerticesCellRenderer : public CellRenderer {
             SkPoint::Make(0, gScalarSize)
         };
         canvas->drawVertices(SkCanvas::kTriangleFan_VertexMode, 4, vertices, nullptr, fColors,
-                             nullptr, nullptr, 0, paint);
+                             SkBlendMode::kModulate, nullptr, 0, paint);
     }
     const char* label() override {
         return "Vertices";
index b30267a..440f6b2 100644 (file)
@@ -194,7 +194,7 @@ protected:
             draw_bitmap,
         };
 
-        auto cf = SkColorFilter::MakeModeFilter(SK_ColorRED, SkXfermode::kSrcIn_Mode);
+        auto cf = SkColorFilter::MakeModeFilter(SK_ColorRED, SkBlendMode::kSrcIn);
         sk_sp<SkImageFilter> filters[] = {
             nullptr,
             IdentityImageFilter::Make(nullptr),
@@ -318,7 +318,7 @@ public:
     ImageFiltersText_CF() : ImageFiltersTextBaseGM("color") {}
 
     void installFilter(SkPaint* paint) override {
-        paint->setColorFilter(SkColorFilter::MakeModeFilter(SK_ColorBLUE, SkXfermode::kSrcIn_Mode));
+        paint->setColorFilter(SkColorFilter::MakeModeFilter(SK_ColorBLUE, SkBlendMode::kSrcIn));
     }
 };
 DEF_GM( return new ImageFiltersText_CF; )
index 0f36c83..e5702aa 100644 (file)
@@ -115,7 +115,7 @@ protected:
         };
 
         sk_sp<SkColorFilter> cf(SkColorFilter::MakeModeFilter(SK_ColorBLUE,
-                                                              SkXfermode::kSrcIn_Mode));
+                                                              SkBlendMode::kSrcIn));
         SkImageFilter::CropRect cropRect(SkRect::Make(SkIRect::MakeXYWH(10, 10, 44, 44)),
                                          SkImageFilter::CropRect::kHasAll_CropEdge);
         SkImageFilter::CropRect bogusRect(SkRect::Make(SkIRect::MakeXYWH(-100, -100, 10, 10)),
@@ -144,7 +144,7 @@ protected:
             SkErodeImageFilter::Make(8, 8, nullptr, &cropRect),
             SkMergeImageFilter::Make(nullptr,
                                      std::move(cfOffset),
-                                     SkXfermode::kSrcOver_Mode,
+                                     SkBlendMode::kSrcOver,
                                      &cropRect),
             SkBlurImageFilter::Make(8.0f, 8.0f, nullptr, &bogusRect),
             SkColorFilterImageFilter::Make(cf, nullptr, &bogusRect),
index 2d27728..fd4d5cf 100644 (file)
@@ -45,12 +45,13 @@ protected:
         {
             sk_sp<SkImageFilter> bitmapSource(SkImageSource::Make(fImage));
             sk_sp<SkColorFilter> cf(SkColorFilter::MakeModeFilter(SK_ColorRED,
-                                                                  SkXfermode::kSrcIn_Mode));
+                                                                  SkBlendMode::kSrcIn));
             sk_sp<SkImageFilter> blur(SkBlurImageFilter::Make(4.0f, 4.0f, std::move(bitmapSource)));
             sk_sp<SkImageFilter> erode(SkErodeImageFilter::Make(4, 4, blur));
             sk_sp<SkImageFilter> color(SkColorFilterImageFilter::Make(std::move(cf),
                                                                       std::move(erode)));
-            sk_sp<SkImageFilter> merge(SkMergeImageFilter::Make(blur, color));
+            sk_sp<SkImageFilter> merge(SkMergeImageFilter::Make(blur, color,
+                                                                SkBlendMode::kSrcOver));
 
             SkPaint paint;
             paint.setImageFilter(std::move(merge));
@@ -143,9 +144,9 @@ protected:
         {
             // Test that crop offsets are absolute, not relative to the parent's crop rect.
             sk_sp<SkColorFilter> cf1(SkColorFilter::MakeModeFilter(SK_ColorBLUE,
-                                                                   SkXfermode::kSrcIn_Mode));
+                                                                   SkBlendMode::kSrcIn));
             sk_sp<SkColorFilter> cf2(SkColorFilter::MakeModeFilter(SK_ColorGREEN,
-                                                                   SkXfermode::kSrcIn_Mode));
+                                                                   SkBlendMode::kSrcIn));
             SkImageFilter::CropRect outerRect(SkRect::MakeXYWH(SkIntToScalar(10), SkIntToScalar(10),
                                                                SkIntToScalar(80), SkIntToScalar(80)));
             SkImageFilter::CropRect innerRect(SkRect::MakeXYWH(SkIntToScalar(20), SkIntToScalar(20),
index 9620e0d..48b1740 100644 (file)
@@ -44,7 +44,7 @@ protected:
     SkISize onISize() override { return SkISize::Make(440, 530); }
 
     void onDraw(SkCanvas* canvas) override {
-        auto cf = SkColorFilter::MakeModeFilter(SK_ColorGREEN, SkXfermode::kSrc_Mode);
+        auto cf = SkColorFilter::MakeModeFilter(SK_ColorGREEN, SkBlendMode::kSrc);
         sk_sp<SkImageFilter> filters[] = {
             SkColorFilterImageFilter::Make(std::move(cf), nullptr),
             SkBlurImageFilter::Make(2.0f, 2.0f, nullptr),
index 86dd617..fd8757b 100644 (file)
@@ -167,7 +167,7 @@ private:
 
         info.fPaintBits = SkLayerDrawLooper::kColorFilter_Bit |
                           SkLayerDrawLooper::kMaskFilter_Bit;
-        info.fColorMode = SkXfermode::kSrc_Mode;
+        info.fColorMode = (SK_XFERMODE_MODE_PARAM)SkBlendMode::kSrc;
         info.fOffset.set(xOff, yOff);
         info.fPostTranslate = false;
 
@@ -175,7 +175,7 @@ private:
 
         paint->setMaskFilter(MakeBlur());
 
-        paint->setColorFilter(SkColorFilter::MakeModeFilter(color, SkXfermode::kSrcIn_Mode));
+        paint->setColorFilter(SkColorFilter::MakeModeFilter(color, SkBlendMode::kSrcIn));
 
         return looperBuilder.detach();
     }
@@ -210,7 +210,7 @@ private:
 
         info.fPaintBits = SkLayerDrawLooper::kColorFilter_Bit |
                           SkLayerDrawLooper::kMaskFilter_Bit;
-        info.fColorMode = SkXfermode::kSrc_Mode;
+        info.fColorMode = (SK_XFERMODE_MODE_PARAM)SkBlendMode::kSrc;
         info.fPostTranslate = false;
 
         SkPaint* paint;
@@ -221,8 +221,7 @@ private:
 
             paint->setMaskFilter(MakeBlur());
 
-            paint->setColorFilter(SkColorFilter::MakeModeFilter(gColors[i],
-                                                                SkXfermode::kSrcIn_Mode));
+            paint->setColorFilter(SkColorFilter::MakeModeFilter(gColors[i], SkBlendMode::kSrcIn));
         }
 
         return looperBuilder.detach();
index ae926ef..cc54e76 100644 (file)
@@ -99,21 +99,21 @@ protected:
         // used with shaders
         SkColor alphas[] = {0xFFFFFFFF, 0x80808080};
 
-        SkXfermode::Mode modes[]  = { // currently just doing the Modes expressible as Coeffs
-            SkXfermode::kClear_Mode,
-            SkXfermode::kSrc_Mode,
-            SkXfermode::kDst_Mode,
-            SkXfermode::kSrcOver_Mode,
-            SkXfermode::kDstOver_Mode,
-            SkXfermode::kSrcIn_Mode,
-            SkXfermode::kDstIn_Mode,
-            SkXfermode::kSrcOut_Mode,
-            SkXfermode::kDstOut_Mode,
-            SkXfermode::kSrcATop_Mode,
-            SkXfermode::kDstATop_Mode,
-            SkXfermode::kXor_Mode,
-            SkXfermode::kPlus_Mode,
-            SkXfermode::kModulate_Mode,
+        const SkBlendMode modes[]  = { // currently just doing the Modes expressible as Coeffs
+            SkBlendMode::kClear,
+            SkBlendMode::kSrc,
+            SkBlendMode::kDst,
+            SkBlendMode::kSrcOver,
+            SkBlendMode::kDstOver,
+            SkBlendMode::kSrcIn,
+            SkBlendMode::kDstIn,
+            SkBlendMode::kSrcOut,
+            SkBlendMode::kDstOut,
+            SkBlendMode::kSrcATop,
+            SkBlendMode::kDstATop,
+            SkBlendMode::kXor,
+            SkBlendMode::kPlus,
+            SkBlendMode::kModulate,
         };
 
         SkPaint paint;
index d7d81f2..35f4c12 100644 (file)
@@ -412,7 +412,7 @@ static void tiled(SkCanvas* finalCanvas, SkMultiPictureDraw* mpd,
             step.fY = SkIntToScalar(y*kTileHeight);
             step.fPaint = new SkPaint;
             step.fPaint->setColorFilter(
-                SkColorFilter::MakeModeFilter(colors[x][y], SkXfermode::kModulate_Mode));
+                SkColorFilter::MakeModeFilter(colors[x][y], SkBlendMode::kModulate));
 
             step.fSurf = create_compat_surface(finalCanvas, kTileWidth, kTileHeight);
 
index 6b2d298..c9831c4 100644 (file)
@@ -85,36 +85,34 @@ DEF_SIMPLE_GM(patch_primitive, canvas, 1500, 1100) {
             {0.0f, 0.0f}, {100.0f, 0.0f}, {100.0f,100.0f}, {0.0f, 100.0f}}
         ;
 
-        const SkXfermode::Mode modes[] = {
-            SkXfermode::kSrc_Mode,
-            SkXfermode::kDst_Mode,
-            SkXfermode::kModulate_Mode,
+        const SkBlendMode modes[] = {
+            SkBlendMode::kSrc,
+            SkBlendMode::kDst,
+            SkBlendMode::kModulate,
         };
 
         sk_sp<SkShader> shader(make_shader());
 
         canvas->save();
         for (int y = 0; y < 3; y++) {
-            sk_sp<SkXfermode> xfer(SkXfermode::Make(modes[y]));
-
             for (int x = 0; x < 4; x++) {
                 canvas->save();
                 canvas->translate(x * 350.0f, y * 350.0f);
                 switch (x) {
                     case 0:
-                        canvas->drawPatch(cubics, nullptr, nullptr, xfer, paint);
+                        canvas->drawPatch(cubics, nullptr, nullptr, modes[y], paint);
                         break;
                     case 1:
-                        canvas->drawPatch(cubics, colors, nullptr, xfer, paint);
+                        canvas->drawPatch(cubics, colors, nullptr, modes[y], paint);
                         break;
                     case 2:
                         paint.setShader(shader);
-                        canvas->drawPatch(cubics, nullptr, texCoords, xfer, paint);
+                        canvas->drawPatch(cubics, nullptr, texCoords, modes[y], paint);
                         paint.setShader(nullptr);
                         break;
                     case 3:
                         paint.setShader(shader);
-                        canvas->drawPatch(cubics, colors, texCoords, xfer, paint);
+                        canvas->drawPatch(cubics, colors, texCoords, modes[y], paint);
                         paint.setShader(nullptr);
                         break;
                     default:
index a36e58f..6f32231 100644 (file)
@@ -109,7 +109,7 @@ protected:
         constexpr int kCols = 4;
 
         canvas->scale(3, 3);
-        SkPatchGrid grid(kRows, kCols, SkPatchGrid::kColors_VertexType, nullptr);
+        SkPatchGrid grid(kRows, kCols, SkPatchGrid::kColors_VertexType);
         for (int i = 0; i < kRows; i++) {
             for (int j = 0; j < kCols; j++) {
                 SkPoint points[12];
index f012145..c252ec6 100644 (file)
@@ -103,7 +103,7 @@ protected:
                     if (kEffect_Type == fType) {
 #if SK_SUPPORT_GPU
                         GrPaint grPaint;
-                        grPaint.setXPFactory(GrPorterDuffXPFactory::Make(SkXfermode::kSrc_Mode));
+                        grPaint.setXPFactory(GrPorterDuffXPFactory::Make(SkBlendMode::kSrc));
 
                         SkRRect rrect = fRRects[curRRect];
                         rrect.offset(SkIntToScalar(x), SkIntToScalar(y));
index 3c49aaa..9d6d98b 100644 (file)
@@ -63,7 +63,7 @@ DEF_SIMPLE_GM_BG(skbug1719, canvas, 300, 100,
         paint.setMaskFilter(
             SkBlurMaskFilter::Make(kNormal_SkBlurStyle, 0.78867501f,
                                    SkBlurMaskFilter::kHighQuality_BlurFlag));
-        paint.setColorFilter(SkColorFilter::MakeModeFilter(0xBFFFFFFF, SkXfermode::kSrcIn_Mode));
+        paint.setColorFilter(SkColorFilter::MakeModeFilter(0xBFFFFFFF, SkBlendMode::kSrcIn));
 
         canvas->clipPath(clipPath, true);
         canvas->drawPath(drawPath, paint);
index 26a3c2c..0f870c6 100644 (file)
@@ -198,12 +198,12 @@ class ComposeColorFilterGM : public skiagm::GM {
         COLOR_COUNT = 3,
         MODE_COUNT = 4,
     };
-    const SkColor*          fColors;
-    const SkXfermode::Mode* fModes;
-    SkString                fName;
+    const SkColor*      fColors;
+    const SkBlendMode*  fModes;
+    SkString            fName;
 
 public:
-    ComposeColorFilterGM(const SkColor colors[], const SkXfermode::Mode modes[],
+    ComposeColorFilterGM(const SkColor colors[], const SkBlendMode modes[],
                          const char suffix[])
         : fColors(colors), fModes(modes)
     {
@@ -276,19 +276,19 @@ private:
 };
 
 const SkColor gColors0[] = { SK_ColorCYAN, SK_ColorMAGENTA, SK_ColorYELLOW };
-const SkXfermode::Mode gModes0[] = {
-    SkXfermode::kOverlay_Mode,
-    SkXfermode::kDarken_Mode,
-    SkXfermode::kColorBurn_Mode,
-    SkXfermode::kExclusion_Mode,
+const SkBlendMode gModes0[] = {
+    SkBlendMode::kOverlay,
+    SkBlendMode::kDarken,
+    SkBlendMode::kColorBurn,
+    SkBlendMode::kExclusion,
 };
 DEF_GM( return new ComposeColorFilterGM(gColors0, gModes0, "wacky"); )
 
 const SkColor gColors1[] = { 0x80FF0000, 0x8000FF00, 0x800000FF };
-const SkXfermode::Mode gModes1[] = {
-    SkXfermode::kSrcOver_Mode,
-    SkXfermode::kXor_Mode,
-    SkXfermode::kDstOut_Mode,
-    SkXfermode::kSrcATop_Mode,
+const SkBlendMode gModes1[] = {
+    SkBlendMode::kSrcOver,
+    SkBlendMode::kXor,
+    SkBlendMode::kDstOut,
+    SkBlendMode::kSrcATop,
 };
 DEF_GM( return new ComposeColorFilterGM(gColors1, gModes1, "alpha"); )
index c269448..05441ac 100644 (file)
@@ -87,7 +87,7 @@ DEF_SIMPLE_GM_BG(texdata, canvas, 2 * S, 2 * S, SK_ColorBLACK) {
         GrFixedClip clip(SkIRect::MakeWH(2*S, 2*S));
 
         GrPaint paint;
-        paint.setPorterDuffXPFactory(SkXfermode::kSrcOver_Mode);
+        paint.setPorterDuffXPFactory(SkBlendMode::kSrcOver);
 
         SkMatrix vm;
         if (i) {
index 37eae66..29f9756 100644 (file)
@@ -115,7 +115,7 @@ static sk_sp<SkDrawLooper> setupLooper(SkLayerDrawLooper::BitFlags bits,
     SkLayerDrawLooper::LayerInfo info;
     info.fPaintBits = bits;
 
-    info.fColorMode = SkXfermode::kSrc_Mode;
+    info.fColorMode = (SK_XFERMODE_MODE_PARAM)SkBlendMode::kSrc;
 
     for (size_t i = 0; i < size; i++) {
         info.fOffset.set(settings[i].fOffset, settings[i].fOffset);
index 70d1420..06c6518 100644 (file)
@@ -114,7 +114,7 @@ protected:
                 for (int m = 0; m < GrTextureDomain::kModeCount; ++m) {
                     GrTextureDomain::Mode mode = (GrTextureDomain::Mode) m;
                     GrPaint grPaint;
-                    grPaint.setXPFactory(GrPorterDuffXPFactory::Make(SkXfermode::kSrc_Mode));
+                    grPaint.setXPFactory(GrPorterDuffXPFactory::Make(SkBlendMode::kSrc));
                     sk_sp<GrFragmentProcessor> fp(
                         GrTextureDomainEffect::Make(texture, nullptr, textureMatrices[tm],
                                                 GrTextureDomain::MakeTexelDomain(texture,
index 58542b7..c7d3e37 100644 (file)
@@ -114,7 +114,7 @@ protected:
         dstRect = SkRect::MakeXYWH(0, 0, 100, 100);
         SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(5, 5, 40, 40));
         sk_sp<SkColorFilter> greenCF = SkColorFilter::MakeModeFilter(SK_ColorGREEN,
-                                                                     SkXfermode::kSrc_Mode);
+                                                                     SkBlendMode::kSrc);
         sk_sp<SkImageFilter> green(SkColorFilterImageFilter::Make(std::move(greenCF),
                                                                   nullptr,
                                                                   &cropRect));
index 2d6e37d..da79d7d 100644 (file)
@@ -27,7 +27,7 @@ static sk_sp<SkShader> make_shader2() {
 }
 
 static sk_sp<SkColorFilter> make_color_filter() {
-    return SkColorFilter::MakeModeFilter(0xFFAABBCC, SkXfermode::kDarken_Mode);
+    return SkColorFilter::MakeModeFilter(0xFFAABBCC, SkBlendMode::kDarken);
 }
 
 class VerticesGM : public skiagm::GM {
@@ -117,36 +117,36 @@ protected:
             { fColors,  fTexs  , fShader2, fColorFilter, 0x80 },
         };
 
-        const SkXfermode::Mode modes[] = {
-            SkXfermode::kClear_Mode,
-            SkXfermode::kSrc_Mode,
-            SkXfermode::kDst_Mode,
-            SkXfermode::kSrcOver_Mode,
-            SkXfermode::kDstOver_Mode,
-            SkXfermode::kSrcIn_Mode,
-            SkXfermode::kDstIn_Mode,
-            SkXfermode::kSrcOut_Mode,
-            SkXfermode::kDstOut_Mode,
-            SkXfermode::kSrcATop_Mode,
-            SkXfermode::kDstATop_Mode,
-            SkXfermode::kXor_Mode,
-            SkXfermode::kPlus_Mode,
-            SkXfermode::kModulate_Mode,
-            SkXfermode::kScreen_Mode,
-            SkXfermode::kOverlay_Mode,
-            SkXfermode::kDarken_Mode,
-            SkXfermode::kLighten_Mode,
-            SkXfermode::kColorDodge_Mode,
-            SkXfermode::kColorBurn_Mode,
-            SkXfermode::kHardLight_Mode,
-            SkXfermode::kSoftLight_Mode,
-            SkXfermode::kDifference_Mode,
-            SkXfermode::kExclusion_Mode,
-            SkXfermode::kMultiply_Mode,
-            SkXfermode::kHue_Mode,
-            SkXfermode::kSaturation_Mode,
-            SkXfermode::kColor_Mode,
-            SkXfermode::kLuminosity_Mode,
+        const SkBlendMode modes[] = {
+            SkBlendMode::kClear,
+            SkBlendMode::kSrc,
+            SkBlendMode::kDst,
+            SkBlendMode::kSrcOver,
+            SkBlendMode::kDstOver,
+            SkBlendMode::kSrcIn,
+            SkBlendMode::kDstIn,
+            SkBlendMode::kSrcOut,
+            SkBlendMode::kDstOut,
+            SkBlendMode::kSrcATop,
+            SkBlendMode::kDstATop,
+            SkBlendMode::kXor,
+            SkBlendMode::kPlus,
+            SkBlendMode::kModulate,
+            SkBlendMode::kScreen,
+            SkBlendMode::kOverlay,
+            SkBlendMode::kDarken,
+            SkBlendMode::kLighten,
+            SkBlendMode::kColorDodge,
+            SkBlendMode::kColorBurn,
+            SkBlendMode::kHardLight,
+            SkBlendMode::kSoftLight,
+            SkBlendMode::kDifference,
+            SkBlendMode::kExclusion,
+            SkBlendMode::kMultiply,
+            SkBlendMode::kHue,
+            SkBlendMode::kSaturation,
+            SkBlendMode::kColor,
+            SkBlendMode::kLuminosity,
         };
 
         SkPaint paint;
@@ -154,7 +154,6 @@ protected:
         canvas->translate(4, 4);
         int x = 0;
         for (size_t j = 0; j < SK_ARRAY_COUNT(modes); ++j) {
-            auto xfer = SkXfermode::Make(modes[j]);
             canvas->save();
             for (size_t i = 0; i < SK_ARRAY_COUNT(rec); ++i) {
                 paint.setShader(rec[i].fShader);
@@ -164,7 +163,7 @@ protected:
                 canvas->drawVertices(SkCanvas::kTriangleFan_VertexMode,
                                      SK_ARRAY_COUNT(fPts), fPts,
                                      rec[i].fTexs, rec[i].fColors,
-                                     xfer, fan, SK_ARRAY_COUNT(fan), paint);
+                                     modes[j], fan, SK_ARRAY_COUNT(fan), paint);
                 canvas->translate(40, 0);
                 ++x;
             }
index d094bdf..34f5e2b 100644 (file)
@@ -114,7 +114,7 @@ protected:
 
             for (int i = 0; i < 6; ++i) {
                 GrPaint grPaint;
-                grPaint.setXPFactory(GrPorterDuffXPFactory::Make(SkXfermode::kSrc_Mode));
+                grPaint.setXPFactory(GrPorterDuffXPFactory::Make(SkBlendMode::kSrc));
                 sk_sp<GrFragmentProcessor> fp(GrYUVEffect::MakeYUVToRGB(
                     texture[indices[i][0]], texture[indices[i][1]], texture[indices[i][2]], sizes,
                     static_cast<SkYUVColorSpace>(space), false));
@@ -227,7 +227,7 @@ protected:
             SkScalar x = kDrawPad + kTestPad;
 
             GrPaint grPaint;
-            grPaint.setXPFactory(GrPorterDuffXPFactory::Make(SkXfermode::kSrc_Mode));
+            grPaint.setXPFactory(GrPorterDuffXPFactory::Make(SkBlendMode::kSrc));
             sk_sp<GrFragmentProcessor> fp(
                 GrYUVEffect::MakeYUVToRGB(texture[0], texture[1], texture[2], sizes,
                                           static_cast<SkYUVColorSpace>(space), true));
index 7e87131..7ff8381 100644 (file)
@@ -16,4 +16,5 @@ android_framework_defines = [
   "SK_SUPPORT_LEGACY_SHADER_ISABITMAP",
   "SK_SUPPORT_LEGACY_COLOR_SPACE_FACTORIES",
   "SK_SUPPORT_LEGACY_SHADER_ASALOCALMATRIXSHADER",
+  "SK_SUPPORT_LEGACY_XFERMODE_PARAM",
 ]
index 31c0aa3..24a9992 100644 (file)
@@ -114,7 +114,7 @@ protected:
                              const SkPoint& offset, const SkPaint& paint) override;
     virtual void drawVertices(const SkDraw&, SkCanvas::VertexMode, int vertexCount,
                               const SkPoint verts[], const SkPoint texs[],
-                              const SkColor colors[], SkXfermode* xmode,
+                              const SkColor colors[], SK_XFERMODE_PARAM xmode,
                               const uint16_t indices[], int indexCount,
                               const SkPaint& paint) override;
     virtual void drawDevice(const SkDraw&, SkBaseDevice*, int x, int y, const SkPaint&) override;
index c233d91..a8db417 100644 (file)
@@ -1196,10 +1196,9 @@ public:
                     in _texture_ space (not uv space) for each vertex.
         @param colors May be null. If not null, specifies a color for each
                       vertex, to be interpolated across the triangle.
-        @param xmode Used if both texs and colors are present. In this
+        @param mode Used if both texs and colors are present. In this
                     case the colors are combined with the texture using mode,
-                    before being drawn using the paint. If mode is null, then
-                    kModulate_Mode is used.
+                    before being drawn using the paint. 
         @param indices If not null, array of indices to reference into the
                     vertex (texs, colors) array.
         @param indexCount number of entries in the indices array (if not null)
@@ -1207,17 +1206,36 @@ public:
     */
     void drawVertices(VertexMode vmode, int vertexCount,
                       const SkPoint vertices[], const SkPoint texs[],
-                      const SkColor colors[], SkXfermode* xmode,
+                      const SkColor colors[], SkBlendMode mode,
                       const uint16_t indices[], int indexCount,
                       const SkPaint& paint);
     void drawVertices(VertexMode vmode, int vertexCount,
                       const SkPoint vertices[], const SkPoint texs[],
+                      const SkColor colors[], const uint16_t indices[], int indexCount,
+                      const SkPaint& paint) {
+        this->drawVertices(vmode, vertexCount, vertices, texs, colors, SkBlendMode::kModulate,
+                           indices, indexCount, paint);
+    }
+
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_PARAM
+    void drawVertices(VertexMode vmode, int vertexCount,
+                      const SkPoint vertices[], const SkPoint texs[],
+                      const SkColor colors[], SkXfermode* xmode,
+                      const uint16_t indices[], int indexCount,
+                      const SkPaint& paint) {
+        this->drawVertices(vmode, vertexCount, vertices, texs, colors,
+                           xmode ? xmode->blend() : SkBlendMode::kModulate,
+                           indices, indexCount, paint);
+    }
+    void drawVertices(VertexMode vmode, int vertexCount,
+                      const SkPoint vertices[], const SkPoint texs[],
                       const SkColor colors[], const sk_sp<SkXfermode>& xmode,
                       const uint16_t indices[], int indexCount,
                       const SkPaint& paint) {
         this->drawVertices(vmode, vertexCount, vertices, texs, colors, xmode.get(),
                            indices, indexCount, paint);
     }
+#endif
 
     /**
      Draw a cubic coons patch
@@ -1228,16 +1246,28 @@ public:
                     their order is clockwise starting at the top left corner.
      @param texCoords specifies the texture coordinates that will be bilerp across the patch,
                     their order is the same as the colors.
-     @param xmode specifies how are the colors and the textures combined if both of them are
+     @param mode specifies how are the colors and the textures combined if both of them are
                     present.
      @param paint Specifies the shader/texture if present.
      */
     void drawPatch(const SkPoint cubics[12], const SkColor colors[4],
-                   const SkPoint texCoords[4], SkXfermode* xmode, const SkPaint& paint);
+                   const SkPoint texCoords[4], SkBlendMode mode, const SkPaint& paint);
+    void drawPatch(const SkPoint cubics[12], const SkColor colors[4],
+                   const SkPoint texCoords[4], const SkPaint& paint) {
+        this->drawPatch(cubics, colors, texCoords, SkBlendMode::kModulate, paint);
+    }
+
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_PARAM
+    void drawPatch(const SkPoint cubics[12], const SkColor colors[4],
+                   const SkPoint texCoords[4], SkXfermode* xmode, const SkPaint& paint) {
+        this->drawPatch(cubics, colors, texCoords, xmode ? xmode->blend() : SkBlendMode::kModulate,
+                        paint);
+    }
     void drawPatch(const SkPoint cubics[12], const SkColor colors[4], const SkPoint texCoords[4],
                    const sk_sp<SkXfermode>& xmode, const SkPaint& paint) {
         this->drawPatch(cubics, colors, texCoords, xmode.get(), paint);
     }
+#endif
 
     /**
      *  Draw a set of sprites from the atlas. Each is specified by a tex rectangle in the
@@ -1247,34 +1277,46 @@ public:
      *      xform maps [0, 0, tex.width, tex.height] -> quad
      *
      *  The color array is optional. When specified, each color modulates the pixels in its
-     *  corresponding quad (via the specified SkXfermode::Mode).
+     *  corresponding quad (via the specified SkBlendMode).
      *
      *  The cullRect is optional. When specified, it must be a conservative bounds of all of the
      *  resulting transformed quads, allowing the canvas to skip drawing if the cullRect does not
      *  intersect the current clip.
      *
      *  The paint is optional. If specified, its antialiasing, alpha, color-filter, image-filter
-     *  and xfermode are used to affect each of the quads.
+     *  and blendmode are used to affect each of the quads.
      */
     void drawAtlas(const SkImage* atlas, const SkRSXform xform[], const SkRect tex[],
-                   const SkColor colors[], int count, SkXfermode::Mode, const SkRect* cullRect,
+                   const SkColor colors[], int count, SkBlendMode, const SkRect* cullRect,
                    const SkPaint* paint);
-
+    void drawAtlas(const sk_sp<SkImage>& atlas, const SkRSXform xform[], const SkRect tex[],
+                   const SkColor colors[], int count, SkBlendMode mode, const SkRect* cullRect,
+                   const SkPaint* paint) {
+        this->drawAtlas(atlas.get(), xform, tex, colors, count, mode, cullRect, paint);
+    }
     void drawAtlas(const SkImage* atlas, const SkRSXform xform[], const SkRect tex[], int count,
                    const SkRect* cullRect, const SkPaint* paint) {
-        this->drawAtlas(atlas, xform, tex, NULL, count, SkXfermode::kDst_Mode, cullRect, paint);
+        this->drawAtlas(atlas, xform, tex, nullptr, count, SkBlendMode::kDst, cullRect, paint);
     }
-
     void drawAtlas(const sk_sp<SkImage>& atlas, const SkRSXform xform[], const SkRect tex[],
-                   const SkColor colors[], int count, SkXfermode::Mode mode, const SkRect* cull,
+                   int count, const SkRect* cullRect, const SkPaint* paint) {
+        this->drawAtlas(atlas.get(), xform, tex, nullptr, count, SkBlendMode::kDst,
+                        cullRect, paint);
+    }
+
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_PARAM
+    void drawAtlas(const SkImage* atlas, const SkRSXform xform[], const SkRect tex[],
+                   const SkColor colors[], int count, SkXfermode::Mode mode, const SkRect* cullRect,
                    const SkPaint* paint) {
-        this->drawAtlas(atlas.get(), xform, tex, colors, count, mode, cull, paint);
+        this->drawAtlas(atlas, xform, tex, colors, count, (SkBlendMode)mode, cullRect, paint);
     }
+
     void drawAtlas(const sk_sp<SkImage>& atlas, const SkRSXform xform[], const SkRect tex[],
-                   int count, const SkRect* cullRect, const SkPaint* paint) {
-        this->drawAtlas(atlas.get(), xform, tex, nullptr, count, SkXfermode::kDst_Mode,
-                        cullRect, paint);
+                   const SkColor colors[], int count, SkXfermode::Mode mode, const SkRect* cull,
+                   const SkPaint* paint) {
+        this->drawAtlas(atlas.get(), xform, tex, colors, count, (SkBlendMode)mode, cull, paint);
     }
+#endif
 
     /**
      *  Draw the contents of this drawable into the canvas. If the canvas is async
@@ -1460,7 +1502,7 @@ protected:
                                 const SkPaint& paint);
 
     virtual void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
-                           const SkPoint texCoords[4], SkXfermode* xmode, const SkPaint& paint);
+                           const SkPoint texCoords[4], SK_XFERMODE_PARAM, const SkPaint& paint);
 
     virtual void onDrawDrawable(SkDrawable*, const SkMatrix*);
 
@@ -1473,11 +1515,11 @@ protected:
     virtual void onDrawRRect(const SkRRect&, const SkPaint&);
     virtual void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&);
     virtual void onDrawVertices(VertexMode, int vertexCount, const SkPoint vertices[],
-                                const SkPoint texs[], const SkColor colors[], SkXfermode*,
+                                const SkPoint texs[], const SkColor colors[], SK_XFERMODE_PARAM,
                                 const uint16_t indices[], int indexCount, const SkPaint&);
 
     virtual void onDrawAtlas(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[],
-                             int count, SkXfermode::Mode, const SkRect* cull, const SkPaint*);
+                             int count, SK_XFERMODE_MODE_PARAM, const SkRect* cull, const SkPaint*);
     virtual void onDrawPath(const SkPath&, const SkPaint&);
     virtual void onDrawImage(const SkImage*, SkScalar dx, SkScalar dy, const SkPaint*);
     virtual void onDrawImageRect(const SkImage*, const SkRect*, const SkRect&, const SkPaint*,
index f265998..e2ff406 100644 (file)
@@ -34,7 +34,7 @@ public:
      *  returns true, and sets (if not NULL) the color and mode appropriately.
      *  If not, this returns false and ignores the parameters.
      */
-    virtual bool asColorMode(SkColor* color, SkXfermode::Mode* mode) const;
+    virtual bool asColorMode(SkColor* color, SK_XFERMODE_MODE_PARAM* mode) const;
 
     /**
      *  If the filter can be represented by a 5x4 matrix, this
@@ -110,15 +110,17 @@ public:
         If the Mode is DST, this function will return NULL (since that
         mode will have no effect on the result).
         @param c    The source color used with the specified mode
-        @param mode The xfermode mode that is applied to each color in
+        @param mode The blend that is applied to each color in
                         the colorfilter's filterSpan[16,32] methods
         @return colorfilter object that applies the src color and mode,
                     or NULL if the mode will have no effect.
     */
-    static sk_sp<SkColorFilter> MakeModeFilter(SkColor c, SkXfermode::Mode mode);
-    static sk_sp<SkColorFilter> MakeModeFilter(SkColor c, SkBlendMode mode) {
-        return MakeModeFilter(c, (SkXfermode::Mode)mode);
+    static sk_sp<SkColorFilter> MakeModeFilter(SkColor c, SkBlendMode mode);
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_PARAM
+    static sk_sp<SkColorFilter> MakeModeFilter(SkColor c, SkXfermode::Mode mode) {
+        return MakeModeFilter(c, (SkBlendMode)mode);
     }
+#endif
 
     /** 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.
index 2884622..d8fa2f2 100644 (file)
@@ -206,7 +206,7 @@ protected:
                              const SkPoint& offset, const SkPaint& paint) = 0;
     virtual void drawVertices(const SkDraw&, SkCanvas::VertexMode, int vertexCount,
                               const SkPoint verts[], const SkPoint texs[],
-                              const SkColor colors[], SkXfermode* xmode,
+                              const SkColor colors[], SK_XFERMODE_PARAM xmode,
                               const uint16_t indices[], int indexCount,
                               const SkPaint& paint) = 0;
     // default implementation unrolls the blob runs.
@@ -214,11 +214,11 @@ protected:
                               const SkPaint& paint, SkDrawFilter* drawFilter);
     // default implementation calls drawVertices
     virtual void drawPatch(const SkDraw&, const SkPoint cubics[12], const SkColor colors[4],
-                           const SkPoint texCoords[4], SkXfermode* xmode, const SkPaint& paint);
+                           const SkPoint texCoords[4], SK_XFERMODE_PARAM, const SkPaint& paint);
 
     // default implementation calls drawPath
     virtual void drawAtlas(const SkDraw&, const SkImage* atlas, const SkRSXform[], const SkRect[],
-                           const SkColor[], int count, SkXfermode::Mode, const SkPaint&);
+                           const SkColor[], int count, SK_XFERMODE_MODE_PARAM, const SkPaint&);
 
     virtual void drawAnnotation(const SkDraw&, const SkRect&, const char[], SkData*) {}
 
index d7068fd..8a2c2d4 100644 (file)
@@ -70,7 +70,7 @@ public:
                         const SkPoint& offset, const SkPaint& paint) const;
     void    drawVertices(SkCanvas::VertexMode mode, int count,
                          const SkPoint vertices[], const SkPoint textures[],
-                         const SkColor colors[], SkXfermode* xmode,
+                         const SkColor colors[], SkBlendMode bmode,
                          const uint16_t indices[], int ptCount,
                          const SkPaint& paint) const;
 
index c2d05f9..088e7dc 100644 (file)
@@ -225,10 +225,11 @@ private:
     // V48: Read and write extended SkTextBlobs.
     // V49: Gradients serialized as SkColor4f + SkColorSpace
     // V50: SkXfermode -> SkBlendMode
+    // V51: more 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 = 51;
 
     static_assert(MIN_PICTURE_VERSION <= 41,
                   "Remove kFontFileName and related code from SkFontDescriptor.cpp.");
index c31ce73..6c4ee0a 100644 (file)
@@ -320,7 +320,10 @@ public:
     struct ComposeRec {
         const SkShader*     fShaderA;
         const SkShader*     fShaderB;
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_PARAM
         const SkXfermode*   fMode;
+#endif
+        SkBlendMode         fBlendMode;
     };
 
     virtual bool asACompose(ComposeRec*) const { return false; }
@@ -420,8 +423,13 @@ public:
      */
     static sk_sp<SkShader> MakeColorShader(const SkColor4f&, sk_sp<SkColorSpace>);
 
+    static sk_sp<SkShader> MakeComposeShader(sk_sp<SkShader> dst, sk_sp<SkShader> src, SkBlendMode);
+
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_PARAM
     static sk_sp<SkShader> MakeComposeShader(sk_sp<SkShader> dst, sk_sp<SkShader> src,
-                                             SkXfermode::Mode);
+                                             SkXfermode::Mode mode) {
+        return MakeComposeShader(dst, src, (SkBlendMode)mode);
+    }
 
     /**
      *  Create a new compose shader, given shaders dst, src, and a combining xfermode mode.
@@ -431,7 +439,10 @@ public:
      *  The caller is responsible for managing its reference-count for the xfer (if not null).
      */
     static sk_sp<SkShader> MakeComposeShader(sk_sp<SkShader> dst, sk_sp<SkShader> src,
-                                             sk_sp<SkXfermode> xfer);
+                                             sk_sp<SkXfermode> xfer) {
+        return MakeComposeShader(dst, src, xfer ? xfer->blend() : SkBlendMode::kSrcOver);
+    }
+#endif
 
     /** Call this to create a new shader that will draw with the specified bitmap.
      *
index 0a3e3ac..9eacfcc 100644 (file)
 
 #include <string.h>
 
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_PARAM
+    #define SK_XFERMODE_PARAM       SkXfermode*
+    #define SK_XFERMODE_MODE_PARAM  SkXfermode::Mode
+#else
+    #define SK_XFERMODE_PARAM       SkBlendMode
+    #define SK_XFERMODE_MODE_PARAM  SkBlendMode
+#endif
+
 /**
  *  sk_careful_memcpy() is just like memcpy(), but guards against undefined behavior.
  *
index aa24366..371c7d7 100644 (file)
@@ -152,7 +152,8 @@ public:
 
     /** Return an SkXfermode object for the specified mode.
      */
-    static sk_sp<SkXfermode> Make(Mode);
+    static sk_sp<SkXfermode> Make(SkBlendMode);
+    static sk_sp<SkXfermode> Make(Mode m) { return Make((SkBlendMode)m); }
 
     /**
      *  Skia maintains global xfermode objects corresponding to each BlendMode. This returns a
@@ -169,10 +170,6 @@ public:
         return xfer.get();
     }
 
-    static sk_sp<SkXfermode> Make(SkBlendMode bm) {
-        return Make((Mode)bm);
-    }
-
     SkBlendMode blend() const {
         Mode mode;
         SkAssertResult(this->asMode(&mode));
@@ -194,6 +191,9 @@ public:
      *  src and dst parameters.
      */
     static bool ModeAsCoeff(Mode mode, Coeff* src, Coeff* dst);
+    static bool ModeAsCoeff(SkBlendMode mode, Coeff* src, Coeff* dst) {
+        return ModeAsCoeff((Mode)mode, src, dst);
+    }
 
     /**
      * Returns whether or not the xfer mode can support treating coverage as alpha
index 186d44a..a6b5332 100644 (file)
@@ -57,7 +57,7 @@ public:
      */
     struct SK_API LayerInfo {
         BitFlags            fPaintBits;
-        SkXfermode::Mode    fColorMode;
+        SK_XFERMODE_MODE_PARAM fColorMode;
         SkVector            fOffset;
         bool                fPostTranslate; //!< applies to fOffset
 
index 5dfa578..3245016 100644 (file)
@@ -17,12 +17,24 @@ public:
     ~SkMergeImageFilter() override;
 
     static sk_sp<SkImageFilter> Make(sk_sp<SkImageFilter> first, sk_sp<SkImageFilter> second,
-                                     SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode,
+                                     SkBlendMode, const CropRect* cropRect = nullptr);
+    static sk_sp<SkImageFilter> MakeN(sk_sp<SkImageFilter>[], int count, const SkBlendMode[],
                                      const CropRect* cropRect = nullptr);
+
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_PARAM
+    static sk_sp<SkImageFilter> Make(sk_sp<SkImageFilter> first, sk_sp<SkImageFilter> second,
+                                     SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode,
+                                     const CropRect* cropRect = nullptr) {
+        return Make(first, second, (SkBlendMode)mode, cropRect);
+    }
     static sk_sp<SkImageFilter> Make(sk_sp<SkImageFilter> filters[],
                                      int count,
                                      const SkXfermode::Mode modes[] = nullptr,
-                                     const CropRect* cropRect = nullptr);
+                                     const CropRect* cropRect = nullptr) {
+        static_assert(sizeof(SkXfermode::Mode) == sizeof(SkBlendMode), "size mismatch");
+        return MakeN(filters, count, (const SkBlendMode*)modes, cropRect);
+    }
+#endif
 
     SK_TO_STRING_OVERRIDE()
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkMergeImageFilter)
@@ -34,7 +46,7 @@ protected:
     bool onCanHandleComplexCTM() const override { return true; }
 
 private:
-    SkMergeImageFilter(sk_sp<SkImageFilter> filters[], int count, const SkXfermode::Mode modes[],
+    SkMergeImageFilter(sk_sp<SkImageFilter> filters[], int count, const SkBlendMode modes[],
                        const CropRect* cropRect);
 
     uint8_t*    fModes; // SkXfermode::Mode
@@ -44,7 +56,7 @@ private:
     intptr_t    fStorage[16];
 
     void initAllocModes();
-    void initModes(const SkXfermode::Mode []);
+    void initModes(const SkBlendMode[]);
 
     typedef SkImageFilter INHERITED;
 };
index a8af3c2..ade2319 100644 (file)
@@ -96,10 +96,6 @@ public:
     }
 
     void setPorterDuffXPFactory(SkBlendMode mode) {
-        fXPFactory = GrPorterDuffXPFactory::Make((SkXfermode::Mode)mode);
-    }
-
-    void setPorterDuffXPFactory(SkXfermode::Mode mode) {
         fXPFactory = GrPorterDuffXPFactory::Make(mode);
     }
 
index 3bd3214..8632093 100644 (file)
@@ -17,8 +17,8 @@ class GrTexture;
  * coefficients.
  */
 namespace GrCustomXfermode {
-    bool IsSupportedMode(SkXfermode::Mode mode);
-    sk_sp<GrXPFactory> MakeXPFactory(SkXfermode::Mode mode);
+    bool IsSupportedMode(SkBlendMode mode);
+    sk_sp<GrXPFactory> MakeXPFactory(SkBlendMode mode);
 };
 
 #endif
index 6777d76..c55eed3 100644 (file)
@@ -16,10 +16,7 @@ class GrProcOptInfo;
 
 class GrPorterDuffXPFactory : public GrXPFactory {
 public:
-    static sk_sp<GrXPFactory> Make(SkXfermode::Mode mode);
-    static sk_sp<GrXPFactory> Make(SkBlendMode mode) {
-        return Make((SkXfermode::Mode)mode);
-    }
+    static sk_sp<GrXPFactory> Make(SkBlendMode mode);
 
     void getInvariantBlendedColor(const GrProcOptInfo& colorPOI,
                                   GrXPFactory::InvariantBlendedColor*) const override;
@@ -54,7 +51,7 @@ public:
     static bool SrcOverWillNeedDstTexture(const GrCaps&, const GrPipelineOptimizations&);
 
 private:
-    GrPorterDuffXPFactory(SkXfermode::Mode);
+    GrPorterDuffXPFactory(SkBlendMode);
 
     GrXferProcessor* onCreateXferProcessor(const GrCaps& caps,
                                            const GrPipelineOptimizations& optimizations,
@@ -71,7 +68,7 @@ private:
     GR_DECLARE_XP_FACTORY_TEST;
     static void TestGetXPOutputTypes(const GrXferProcessor*, int* outPrimary, int* outSecondary);
 
-    SkXfermode::Mode fXfermode;
+    SkBlendMode fXfermode;
 
     friend class GrPorterDuffTest; // for TestGetXPOutputTypes()
     typedef GrXPFactory INHERITED;
index 0e2435e..edc5ae7 100644 (file)
@@ -8,7 +8,8 @@
 #ifndef GrXfermodeFragmentProcessor_DEFINED
 #define GrXfermodeFragmentProcessor_DEFINED
 
-#include "SkXfermode.h"
+#include "SkRefCnt.h"
+#include "SkBlendMode.h"
 
 class GrFragmentProcessor;
 
@@ -16,19 +17,19 @@ namespace GrXfermodeFragmentProcessor {
     /** The color input to the returned processor is treated as the src and the passed in processor
         is the dst. */
     sk_sp<GrFragmentProcessor> MakeFromDstProcessor(sk_sp<GrFragmentProcessor> dst,
-                                                    SkXfermode::Mode mode);
+                                                    SkBlendMode mode);
 
     /** The color input to the returned processor is treated as the dst and the passed in processor
         is the src. */
     sk_sp<GrFragmentProcessor> MakeFromSrcProcessor(sk_sp<GrFragmentProcessor> src,
-                                                    SkXfermode::Mode mode);
+                                                    SkBlendMode mode);
 
     /** Takes the input color, which is assumed to be unpremultiplied, passes it as an opaque color
         to both src and dst. The outputs of a src and dst are blended using mode and the original
         input's alpha is applied to the blended color to produce a premul output. */
     sk_sp<GrFragmentProcessor> MakeFromTwoProcessors(sk_sp<GrFragmentProcessor> src,
                                                      sk_sp<GrFragmentProcessor> dst,
-                                                     SkXfermode::Mode mode);
+                                                     SkBlendMode mode);
 };
 
 #endif
index 05f935b..447764f 100644 (file)
@@ -327,7 +327,7 @@ RECORD(DrawPatch, kDraw_Tag|kHasPaint_Tag,
         PODArray<SkPoint> cubics;
         PODArray<SkColor> colors;
         PODArray<SkPoint> texCoords;
-        sk_sp<SkXfermode> xmode);
+        SkBlendMode bmode);
 RECORD(DrawAtlas, kDraw_Tag|kHasImage_Tag|kHasPaint_Tag,
         Optional<SkPaint> paint;
         sk_sp<const SkImage> atlas;
@@ -335,7 +335,7 @@ RECORD(DrawAtlas, kDraw_Tag|kHasImage_Tag|kHasPaint_Tag,
         PODArray<SkRect> texs;
         PODArray<SkColor> colors;
         int count;
-        SkXfermode::Mode mode;
+        SkBlendMode mode;
         Optional<SkRect> cull);
 RECORD(DrawVertices, kDraw_Tag|kHasPaint_Tag,
         SkPaint paint;
@@ -344,7 +344,7 @@ RECORD(DrawVertices, kDraw_Tag|kHasPaint_Tag,
         PODArray<SkPoint> vertices;
         PODArray<SkPoint> texs;
         PODArray<SkColor> colors;
-        sk_sp<SkXfermode> xmode;
+        SkBlendMode bmode;
         PODArray<uint16_t> indices;
         int indexCount);
 RECORD(DrawAnnotation, 0,  // TODO: kDraw_Tag, skia:5548
index e111853..a25f2b8 100644 (file)
@@ -93,7 +93,7 @@ protected:
     virtual void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
                                 const SkPaint& paint) override;
     virtual void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
-                             const SkPoint texCoords[4], SkXfermode* xmode,
+                             const SkPoint texCoords[4], SK_XFERMODE_PARAM xmode,
                              const SkPaint& paint) override;
 
     void onDrawPaint(const SkPaint&) override;
@@ -113,7 +113,7 @@ protected:
                           const SkPaint*) override;
     void onDrawVertices(VertexMode vmode, int vertexCount,
                         const SkPoint vertices[], const SkPoint texs[],
-                        const SkColor colors[], SkXfermode* xmode,
+                        const SkColor colors[], SK_XFERMODE_PARAM xmode,
                         const uint16_t indices[], int indexCount,
                         const SkPaint&) override;
 
index ac29f6f..6342fba 100644 (file)
@@ -59,7 +59,7 @@ protected:
                           const SkPaint*) override;
     void onDrawVertices(VertexMode vmode, int vertexCount,
                         const SkPoint vertices[], const SkPoint texs[],
-                        const SkColor colors[], SkXfermode* xmode,
+                        const SkColor colors[], SK_XFERMODE_PARAM xmode,
                         const uint16_t indices[], int indexCount,
                         const SkPaint&) override;
 
index 4e7f422..6a3728b 100644 (file)
@@ -52,7 +52,7 @@ protected:
     void onDrawTextRSXform(const void* text, size_t byteLength, const SkRSXform xform[],
                            const SkRect* cull, const SkPaint& paint) override;
     virtual void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
-                             const SkPoint texCoords[4], SkXfermode* xmode,
+                             const SkPoint texCoords[4], SK_XFERMODE_PARAM xmode,
                              const SkPaint& paint) override;
 
     void onDrawPaint(const SkPaint&) override;
@@ -72,7 +72,7 @@ protected:
                           const SkPaint*) override;
     void onDrawVertices(VertexMode vmode, int vertexCount,
                               const SkPoint vertices[], const SkPoint texs[],
-                              const SkColor colors[], SkXfermode* xmode,
+                              const SkColor colors[], SK_XFERMODE_PARAM xmode,
                               const uint16_t indices[], int indexCount,
                               const SkPaint&) override;
 
index d0a79fd..69cdff4 100644 (file)
@@ -76,11 +76,11 @@ protected:
                          const SkPaint*) override;
     void onDrawVertices(VertexMode vmode, int vertexCount,
                               const SkPoint vertices[], const SkPoint texs[],
-                              const SkColor colors[], SkXfermode* xmode,
+                              const SkColor colors[], SK_XFERMODE_PARAM xmode,
                               const uint16_t indices[], int indexCount,
                               const SkPaint&) override;
     void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
-                             const SkPoint texCoords[4], SkXfermode* xmode,
+                             const SkPoint texCoords[4], SK_XFERMODE_PARAM xmode,
                              const SkPaint& paint) override;
     void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) override;
 
index 7b16f38..5f3d73d 100644 (file)
@@ -615,6 +615,7 @@ DEFINES_ALL = [
     "SK_SUPPORT_LEGACY_XFERMODE_OBJECT",
     "SK_SUPPORT_LEGACY_COLOR_SPACE_FACTORIES",
     "SK_SUPPORT_LEGACY_SHADER_ASALOCALMATRIXSHADER",
+    "SK_SUPPORT_LEGACY_XFERMODE_PARAM",
 ]
 
 ################################################################################
index a2033c3..9adb08a 100644 (file)
@@ -148,12 +148,10 @@ protected:
             { fTexX - texWidth, fTexY + texHeight}}
         ;
         
-        sk_sp<SkXfermode> xfer(SkXfermode::Make(SkXfermode::kSrc_Mode));
-
         SkScalar scaleFreq = 2.0;
         fShader1 = SkPerlinNoiseShader2::MakeImprovedNoise(fXFreq/scaleFreq, fYFreq/scaleFreq, 4,
                                                              fSeed);
-        fShaderCompose = SkShader::MakeComposeShader(fShader0, fShader1, nullptr);
+        fShaderCompose = SkShader::MakeComposeShader(fShader0, fShader1, SkBlendMode::kSrcOver);
 
         paint.setShader(fShaderCompose);
 
@@ -161,7 +159,7 @@ protected:
         if (fShowGrid) {
             tex = nullptr;
         }
-        canvas->drawPatch(fPts, nullptr, tex, xfer, paint);
+        canvas->drawPatch(fPts, nullptr, tex, SkBlendMode::kSrc, paint);
 
         draw_control_points(canvas, fPts);
     }
index 8c1ace5..94c12cd 100644 (file)
@@ -504,7 +504,7 @@ protected:
         auto shaderB = SkGradientShader::MakeLinear(pts, colors2, nullptr,
             2, SkShader::kClamp_TileMode);
         return SkShader::MakeComposeShader(std::move(shaderA), std::move(shaderB),
-                                           SkXfermode::Make(SkXfermode::kDstIn_Mode));
+                                           SkBlendMode::kDstIn);
     }
 
     virtual void startTest() {
index 3daf312..f89b37d 100644 (file)
@@ -21,7 +21,7 @@ typedef void (*DrawAtlasProc)(SkCanvas*, SkImage*, const SkRSXform[], const SkRe
 static void draw_atlas(SkCanvas* canvas, SkImage* atlas, const SkRSXform xform[],
                        const SkRect tex[], const SkColor colors[], int count, const SkRect* cull,
                        const SkPaint* paint) {
-    canvas->drawAtlas(atlas, xform, tex, colors, count, SkXfermode::kModulate_Mode, cull, paint);
+    canvas->drawAtlas(atlas, xform, tex, colors, count, SkBlendMode::kModulate, cull, paint);
 }
 
 static void draw_atlas_sim(SkCanvas* canvas, SkImage* atlas, const SkRSXform xform[],
index 67c7b2e..60ab013 100644 (file)
@@ -151,21 +151,21 @@ protected:
             return;
         }
 
-        static const SkXfermode::Mode gModes[] = {
-            SkXfermode::kClear_Mode,
-            SkXfermode::kSrc_Mode,
-            SkXfermode::kDst_Mode,
-            SkXfermode::kSrcOver_Mode,
-            SkXfermode::kDstOver_Mode,
-            SkXfermode::kSrcIn_Mode,
-            SkXfermode::kDstIn_Mode,
-            SkXfermode::kSrcOut_Mode,
-            SkXfermode::kDstOut_Mode,
-            SkXfermode::kSrcATop_Mode,
-            SkXfermode::kDstATop_Mode,
-            SkXfermode::kXor_Mode,
-            SkXfermode::kPlus_Mode,
-            SkXfermode::kModulate_Mode,
+        static const SkBlendMode gModes[] = {
+            SkBlendMode::kClear,
+            SkBlendMode::kSrc,
+            SkBlendMode::kDst,
+            SkBlendMode::kSrcOver,
+            SkBlendMode::kDstOver,
+            SkBlendMode::kSrcIn,
+            SkBlendMode::kDstIn,
+            SkBlendMode::kSrcOut,
+            SkBlendMode::kDstOut,
+            SkBlendMode::kSrcATop,
+            SkBlendMode::kDstATop,
+            SkBlendMode::kXor,
+            SkBlendMode::kPlus,
+            SkBlendMode::kModulate,
         };
 
         static const SkColor gColors[] = {
index 28aa5f4..139166f 100644 (file)
@@ -558,7 +558,7 @@ static sk_sp<SkImageFilter> 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<SkColorFilter> cf(make_color_filter());
index 641e1e9..243d106 100644 (file)
@@ -188,8 +188,7 @@ void Patch::draw(SkCanvas* canvas, const SkPaint& paint, int nu, int nv,
         t += dt;
         canvas->drawVertices(SkCanvas::kTriangleStrip_VertexMode, stripCount,
                              strip, doTextures ? tex : nullptr,
-                             doColors ? colors : nullptr, nullptr,
-                             nullptr, 0, paint);
+                             doColors ? colors : nullptr, nullptr, 0, paint);
     }
 }
 
index 608199d..ba3b80d 100644 (file)
@@ -34,8 +34,7 @@ static sk_sp<SkShader> make_bitmapfade(const SkBitmap& bm) {
     auto shaderB = SkShader::MakeBitmapShader(bm,
                                               SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
 
-    return SkShader::MakeComposeShader(std::move(shaderB), std::move(shaderA),
-                                       SkXfermode::Make(SkXfermode::kDstIn_Mode));
+    return SkShader::MakeComposeShader(std::move(shaderB), std::move(shaderA), SkBlendMode::kDstIn);
 }
 
 class ShaderView : public SampleView {
@@ -62,7 +61,7 @@ public:
         auto shaderB = SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
 
         fShader = SkShader::MakeComposeShader(std::move(shaderA), std::move(shaderB),
-                                              SkXfermode::Make(SkXfermode::kDstIn_Mode));
+                                              SkBlendMode::kDstIn);
     }
 
 protected:
index 1335c31..9d65b6f 100644 (file)
@@ -26,7 +26,7 @@ const SkColor[], int, const SkRect*, const SkPaint*);
 static void draw_atlas(SkCanvas* canvas, SkImage* atlas, const SkRSXform xform[],
                        const SkRect tex[], const SkColor colors[], int count, const SkRect* cull,
                        const SkPaint* paint) {
-    canvas->drawAtlas(atlas, xform, tex, colors, count, SkXfermode::kModulate_Mode, cull, paint);
+    canvas->drawAtlas(atlas, xform, tex, colors, count, SkBlendMode::kModulate, cull, paint);
 }
 
 static void draw_atlas_sim(SkCanvas* canvas, SkImage* atlas, const SkRSXform xform[],
index 521e9f6..43221d4 100644 (file)
@@ -436,21 +436,21 @@ static void mesh_slide(SkCanvas* canvas) {
         paint.setShader(nullptr);
         canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
                              fRecs[i].fVerts, fRecs[i].fTexs,
-                             nullptr, nullptr, nullptr, 0, paint);
+                             nullptr, nullptr, 0, paint);
 
         canvas->translate(SkIntToScalar(210), 0);
 
         paint.setShader(fShader0);
         canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
                              fRecs[i].fVerts, fRecs[i].fTexs,
-                             nullptr, nullptr, nullptr, 0, paint);
+                             nullptr, nullptr, 0, paint);
 
         canvas->translate(SkIntToScalar(210), 0);
 
         paint.setShader(fShader1);
         canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
                              fRecs[i].fVerts, fRecs[i].fTexs,
-                             nullptr, nullptr, nullptr, 0, paint);
+                             nullptr, nullptr, 0, paint);
         canvas->restore();
 
         canvas->translate(0, SkIntToScalar(250));
index 0d43962..3ba98bb 100644 (file)
@@ -90,21 +90,21 @@ protected:
             paint.setShader(nullptr);
             canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
                                  fRecs[i].fVerts, fRecs[i].fTexs,
-                                 nullptr, nullptr, nullptr, 0, paint);
+                                 nullptr, nullptr, 0, paint);
 
             canvas->translate(SkIntToScalar(250), 0);
 
             paint.setShader(fShader0);
             canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
                                  fRecs[i].fVerts, fRecs[i].fTexs,
-                                 nullptr, nullptr, nullptr, 0, paint);
+                                 nullptr, nullptr, 0, paint);
 
             canvas->translate(SkIntToScalar(250), 0);
 
             paint.setShader(fShader1);
             canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount,
                                  fRecs[i].fVerts, fRecs[i].fTexs,
-                                 nullptr, nullptr, nullptr, 0, paint);
+                                 nullptr, nullptr, 0, paint);
             canvas->restore();
 
             canvas->translate(0, SkIntToScalar(250));
index e663cce..cb177e0 100644 (file)
@@ -367,10 +367,16 @@ void SkBitmapDevice::drawPosText(const SkDraw& draw, const void* text, size_t le
 void SkBitmapDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode,
                                   int vertexCount,
                                   const SkPoint verts[], const SkPoint textures[],
-                                  const SkColor colors[], SkXfermode* xmode,
+                                  const SkColor colors[], SK_XFERMODE_PARAM xmode,
                                   const uint16_t indices[], int indexCount,
                                   const SkPaint& paint) {
-    draw.drawVertices(vmode, vertexCount, verts, textures, colors, xmode,
+    SkBlendMode bmode;
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_PARAM
+    bmode = xmode ? xmode->blend() : SkBlendMode::kModulate;
+#else
+    bmode = xmode;
+#endif
+    draw.drawVertices(vmode, vertexCount, verts, textures, colors, bmode,
                       indices, indexCount, paint);
 }
 
index 4e74a77..0fdbc58 100644 (file)
@@ -1879,8 +1879,13 @@ void SkCanvas::drawPoints(PointMode mode, size_t count, const SkPoint pts[], con
 }
 
 void SkCanvas::drawVertices(VertexMode vmode, int vertexCount, const SkPoint vertices[],
-                            const SkPoint texs[], const SkColor colors[], SkXfermode* xmode,
+                            const SkPoint texs[], const SkColor colors[], SkBlendMode bmode,
                             const uint16_t indices[], int indexCount, const SkPaint& paint) {
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_PARAM
+    SkXfermode* xmode = SkXfermode::Peek(bmode);
+#else
+    SkBlendMode xmode = bmode;
+#endif
     this->onDrawVertices(vmode, vertexCount, vertices, texs, colors, xmode,
                          indices, indexCount, paint);
 }
@@ -2009,16 +2014,15 @@ void SkCanvas::drawBitmapLattice(const SkBitmap& bitmap, const Lattice& lattice,
 }
 
 void SkCanvas::drawAtlas(const SkImage* atlas, const SkRSXform xform[], const SkRect tex[],
-                         const SkColor colors[], int count, SkXfermode::Mode mode,
+                         const SkColor colors[], int count, SkBlendMode mode,
                          const SkRect* cull, const SkPaint* paint) {
     RETURN_ON_NULL(atlas);
     if (count <= 0) {
         return;
     }
     SkASSERT(atlas);
-    SkASSERT(xform);
     SkASSERT(tex);
-    this->onDrawAtlas(atlas, xform, tex, colors, count, mode, cull, paint);
+    this->onDrawAtlas(atlas, xform, tex, colors, count, (SK_XFERMODE_MODE_PARAM)mode, cull, paint);
 }
 
 void SkCanvas::drawAnnotation(const SkRect& rect, const char key[], SkData* value) {
@@ -2827,7 +2831,7 @@ void SkCanvas::drawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
 
 void SkCanvas::onDrawVertices(VertexMode vmode, int vertexCount,
                               const SkPoint verts[], const SkPoint texs[],
-                              const SkColor colors[], SkXfermode* xmode,
+                              const SkColor colors[], SK_XFERMODE_PARAM xmode,
                               const uint16_t indices[], int indexCount,
                               const SkPaint& paint) {
     TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawVertices()");
@@ -2843,17 +2847,24 @@ void SkCanvas::onDrawVertices(VertexMode vmode, int vertexCount,
 }
 
 void SkCanvas::drawPatch(const SkPoint cubics[12], const SkColor colors[4],
-                         const SkPoint texCoords[4], SkXfermode* xmode, const SkPaint& paint) {
+                         const SkPoint texCoords[4], SkBlendMode bmode,
+                         const SkPaint& paint) {
     TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPatch()");
     if (nullptr == cubics) {
         return;
     }
 
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_PARAM
+    SkXfermode* xmode = SkXfermode::Peek(bmode);
+#else
+    SkBlendMode xmode = bmode;
+#endif
     this->onDrawPatch(cubics, colors, texCoords, xmode, paint);
 }
 
 void SkCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
-                           const SkPoint texCoords[4], SkXfermode* xmode, const SkPaint& paint) {
+                           const SkPoint texCoords[4], SK_XFERMODE_PARAM xmode,
+                           const SkPaint& paint) {
     // Since a patch is always within the convex hull of the control points, we discard it when its
     // bounding rectangle is completely outside the current clip.
     SkRect bounds;
@@ -2896,7 +2907,7 @@ void SkCanvas::onDrawDrawable(SkDrawable* dr, const SkMatrix* matrix) {
 }
 
 void SkCanvas::onDrawAtlas(const SkImage* atlas, const SkRSXform xform[], const SkRect tex[],
-                           const SkColor colors[], int count, SkXfermode::Mode mode,
+                           const SkColor colors[], int count, SK_XFERMODE_MODE_PARAM mode,
                            const SkRect* cull, const SkPaint* paint) {
     if (cull && this->quickReject(*cull)) {
         return;
index b23b100..23def9f 100644 (file)
@@ -19,7 +19,7 @@
 #include "GrFragmentProcessor.h"
 #endif
 
-bool SkColorFilter::asColorMode(SkColor* color, SkXfermode::Mode* mode) const {
+bool SkColorFilter::asColorMode(SkColor* color, SK_XFERMODE_MODE_PARAM* mode) const {
     return false;
 }
 
index 51e30ea..8c21453 100644 (file)
 #include "SkXfermode.h"
 #include "SkString.h"
 
+sk_sp<SkShader> SkShader::MakeComposeShader(sk_sp<SkShader> dst, sk_sp<SkShader> src,
+                                            SkBlendMode mode) {
+    if (!src || !dst) {
+        return nullptr;
+    }
+    if (SkBlendMode::kSrc == mode) {
+        return src;
+    }
+    if (SkBlendMode::kDst == mode) {
+        return dst;
+    }
+    return sk_sp<SkShader>(new SkComposeShader(std::move(dst), std::move(src), mode));
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 
 size_t SkComposeShader::onContextSize(const ContextRec& rec) const {
@@ -42,17 +56,23 @@ private:
 sk_sp<SkFlattenable> SkComposeShader::CreateProc(SkReadBuffer& buffer) {
     sk_sp<SkShader> shaderA(buffer.readShader());
     sk_sp<SkShader> shaderB(buffer.readShader());
-    sk_sp<SkXfermode> mode(buffer.readXfermode());
+    SkBlendMode mode;
+    if (buffer.isVersionLT(SkReadBuffer::kXfermodeToBlendMode2_Version)) {
+        sk_sp<SkXfermode> xfer = buffer.readXfermode();
+        mode = xfer ? xfer->blend() : SkBlendMode::kSrcOver;
+    } else {
+        mode = (SkBlendMode)buffer.read32();
+    }
     if (!shaderA || !shaderB) {
         return nullptr;
     }
-    return sk_make_sp<SkComposeShader>(std::move(shaderA), std::move(shaderB), std::move(mode));
+    return sk_make_sp<SkComposeShader>(std::move(shaderA), std::move(shaderB), mode);
 }
 
 void SkComposeShader::flatten(SkWriteBuffer& buffer) const {
     buffer.writeFlattenable(fShaderA.get());
     buffer.writeFlattenable(fShaderB.get());
-    buffer.writeFlattenable(fMode.get());
+    buffer.write32((int)fMode);
 }
 
 template <typename T> void safe_call_destructor(T* obj) {
@@ -107,7 +127,10 @@ bool SkComposeShader::asACompose(ComposeRec* rec) const {
     if (rec) {
         rec->fShaderA = fShaderA.get();
         rec->fShaderB = fShaderB.get();
-        rec->fMode = fMode.get();
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_PARAM
+        rec->fMode = SkXfermode::Peek(fMode);
+#endif
+        rec->fBlendMode = fMode;
     }
     return true;
 }
@@ -120,12 +143,13 @@ bool SkComposeShader::asACompose(ComposeRec* rec) const {
 void SkComposeShader::ComposeShaderContext::shadeSpan(int x, int y, SkPMColor result[], int count) {
     SkShader::Context* shaderContextA = fShaderContextA;
     SkShader::Context* shaderContextB = fShaderContextB;
-    SkXfermode*        mode = static_cast<const SkComposeShader&>(fShader).fMode.get();
+    SkBlendMode        mode = static_cast<const SkComposeShader&>(fShader).fMode;
     unsigned           scale = SkAlpha255To256(this->getPaintAlpha());
 
     SkPMColor   tmp[TMP_COLOR_COUNT];
 
-    if (nullptr == mode) {   // implied SRC_OVER
+    SkXfermode* xfer = SkXfermode::Peek(mode);
+    if (nullptr == xfer) {   // implied SRC_OVER
         // TODO: when we have a good test-case, should use SkBlitRow::Proc32
         // for these loops
         do {
@@ -161,7 +185,7 @@ void SkComposeShader::ComposeShaderContext::shadeSpan(int x, int y, SkPMColor re
 
             shaderContextA->shadeSpan(x, y, result, n);
             shaderContextB->shadeSpan(x, y, tmp, n);
-            mode->xfer32(result, tmp, n, nullptr);
+            xfer->xfer32(result, tmp, n, nullptr);
 
             if (256 != scale) {
                 for (int i = 0; i < n; i++) {
@@ -184,21 +208,15 @@ void SkComposeShader::ComposeShaderContext::shadeSpan(int x, int y, SkPMColor re
 /////////////////////////////////////////////////////////////////////
 
 sk_sp<GrFragmentProcessor> SkComposeShader::asFragmentProcessor(const AsFPArgs& args) const {
-    // Fragment processor will only support SkXfermode::Mode modes currently.
-    SkXfermode::Mode mode;
-    if (!(SkXfermode::AsMode(fMode, &mode))) {
-        return nullptr;
-    }
-
-    switch (mode) {
-        case SkXfermode::kClear_Mode:
+    switch (fMode) {
+        case SkBlendMode::kClear:
             return GrConstColorProcessor::Make(GrColor4f::TransparentBlack(),
                                                GrConstColorProcessor::kIgnore_InputMode);
             break;
-        case SkXfermode::kSrc_Mode:
+        case SkBlendMode::kSrc:
             return fShaderB->asFragmentProcessor(args);
             break;
-        case SkXfermode::kDst_Mode:
+        case SkBlendMode::kDst:
             return fShaderA->asFragmentProcessor(args);
             break;
         default:
@@ -211,7 +229,7 @@ sk_sp<GrFragmentProcessor> SkComposeShader::asFragmentProcessor(const AsFPArgs&
                 return nullptr;
             }
             return GrXfermodeFragmentProcessor::MakeFromTwoProcessors(std::move(fpB),
-                                                                      std::move(fpA), mode);
+                                                                      std::move(fpA), fMode);
     }
 }
 #endif
@@ -224,9 +242,8 @@ void SkComposeShader::toString(SkString* str) const {
     fShaderA->toString(str);
     str->append(" ShaderB: ");
     fShaderB->toString(str);
-    if (fMode) {
-        str->append(" Xfermode: ");
-        fMode->toString(str);
+    if (SkBlendMode::kSrcOver != fMode) {
+        str->appendf(" Xfermode: %s", SkXfermode::ModeName(fMode));
     }
 
     this->INHERITED::toString(str);
@@ -234,18 +251,3 @@ void SkComposeShader::toString(SkString* str) const {
     str->append(")");
 }
 #endif
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-sk_sp<SkShader> SkShader::MakeComposeShader(sk_sp<SkShader> dst, sk_sp<SkShader> src,
-                                            sk_sp<SkXfermode> xfer) {
-    if (!dst || !src) {
-        return nullptr;
-    }
-    return sk_make_sp<SkComposeShader>(std::move(dst), std::move(src), std::move(xfer));
-}
-
-sk_sp<SkShader> SkShader::MakeComposeShader(sk_sp<SkShader> dst, sk_sp<SkShader> src,
-                                            SkXfermode::Mode mode) {
-    return MakeComposeShader(std::move(dst), std::move(src), SkXfermode::Make(mode));
-}
index d1b095e..95da9c8 100644 (file)
@@ -9,7 +9,7 @@
 #define SkComposeShader_DEFINED
 
 #include "SkShader.h"
-#include "SkXfermode.h"
+#include "SkBlendMode.h"
 
 ///////////////////////////////////////////////////////////////////////////////////////////
 
@@ -28,10 +28,10 @@ public:
         @param mode     The xfermode that combines the colors from the two shaders. If mode
                         is null, then SRC_OVER is assumed.
     */
-    SkComposeShader(sk_sp<SkShader> sA, sk_sp<SkShader> sB, sk_sp<SkXfermode> mode)
+    SkComposeShader(sk_sp<SkShader> sA, sk_sp<SkShader> sB, SkBlendMode mode)
         : fShaderA(std::move(sA))
         , fShaderB(std::move(sB))
-        , fMode(std::move(mode))
+        , fMode(mode)
     {}
 
 #if SK_SUPPORT_GPU
@@ -78,7 +78,7 @@ protected:
 private:
     sk_sp<SkShader>     fShaderA;
     sk_sp<SkShader>     fShaderB;
-    sk_sp<SkXfermode>   fMode;
+    SkBlendMode         fMode;
 
     typedef SkShader INHERITED;
 };
index 70eabab..30da202 100644 (file)
@@ -119,7 +119,7 @@ void SkBaseDevice::drawDRRect(const SkDraw& draw, const SkRRect& outer,
 }
 
 void SkBaseDevice::drawPatch(const SkDraw& draw, const SkPoint cubics[12], const SkColor colors[4],
-                             const SkPoint texCoords[4], SkXfermode* xmode, const SkPaint& paint) {
+                             const SkPoint texCoords[4], SK_XFERMODE_PARAM xmode, const SkPaint& paint) {
     SkPatchUtils::VertexData data;
 
     SkISize lod = SkPatchUtils::GetLevelOfDetail(cubics, draw.fMatrix);
@@ -240,7 +240,7 @@ void SkBaseDevice::drawBitmapLattice(const SkDraw& draw, const SkBitmap& bitmap,
 
 void SkBaseDevice::drawAtlas(const SkDraw& draw, const SkImage* atlas, const SkRSXform xform[],
                              const SkRect tex[], const SkColor colors[], int count,
-                             SkXfermode::Mode mode, const SkPaint& paint) {
+                             SK_XFERMODE_MODE_PARAM mode, const SkPaint& paint) {
     SkPath path;
     path.setIsVolatile(true);
 
@@ -262,7 +262,7 @@ void SkBaseDevice::drawAtlas(const SkDraw& draw, const SkImage* atlas, const SkR
         pnt.setShader(std::move(shader));
 
         if (colors) {
-            pnt.setColorFilter(SkColorFilter::MakeModeFilter(colors[i], mode));
+            pnt.setColorFilter(SkColorFilter::MakeModeFilter(colors[i], (SkBlendMode)mode));
         }
 
         path.rewind();
index 2a88781..44e31c4 100644 (file)
@@ -1888,7 +1888,7 @@ void SkTriColorShader::toString(SkString* str) const {
 
 void SkDraw::drawVertices(SkCanvas::VertexMode vmode, int count,
                           const SkPoint vertices[], const SkPoint textures[],
-                          const SkColor colors[], SkXfermode* xmode,
+                          const SkColor colors[], SkBlendMode bmode,
                           const uint16_t indices[], int indexCount,
                           const SkPaint& paint) const {
     SkASSERT(0 == count || vertices);
@@ -1935,9 +1935,7 @@ void SkDraw::drawVertices(SkCanvas::VertexMode vmode, int count,
         } else {
             // colors * texture
             SkASSERT(shader);
-            sk_sp<SkXfermode> xfer = xmode ? sk_ref_sp(xmode)
-                                           : SkXfermode::Make(SkXfermode::kModulate_Mode);
-            p.setShader(SkShader::MakeComposeShader(triShader, sk_ref_sp(shader), std::move(xfer)));
+            p.setShader(SkShader::MakeComposeShader(triShader, sk_ref_sp(shader), bmode));
         }
     }
 
index ea9180b..fd20885 100644 (file)
@@ -454,8 +454,13 @@ namespace {
     struct DrawPatch final : Op {
         static const auto kType = Type::DrawPatch;
         DrawPatch(const SkPoint cubics[12], const SkColor colors[4], const SkPoint texs[4],
-                  SkXfermode* xfermode, const SkPaint& paint)
-            : xfermode(sk_ref_sp(xfermode)), paint(paint) {
+                  SK_XFERMODE_PARAM xfermode, const SkPaint& paint)
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_PARAM
+            : xfermode(sk_ref_sp(xfermode)), paint(paint)
+#else
+            : xfermode(xfermode), paint(paint)
+#endif
+        {
             copy_v(this->cubics, cubics, 12);
             if (colors) { copy_v(this->colors, colors, 4); has_colors = true; }
             if (texs  ) { copy_v(this->texs  , texs  , 4); has_texs   = true; }
@@ -463,13 +468,17 @@ namespace {
         SkPoint           cubics[12];
         SkColor           colors[4];
         SkPoint           texs[4];
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_PARAM
         sk_sp<SkXfermode> xfermode;
+#else
+        SkBlendMode       xfermode;
+#endif
         SkPaint           paint;
         bool              has_colors = false;
         bool              has_texs   = false;
         void draw(SkCanvas* c, const SkMatrix&) {
             c->drawPatch(cubics, has_colors ? colors : nullptr, has_texs ? texs : nullptr,
-                         xfermode.get(), paint);
+                         xfermode, paint);
         }
     };
     struct DrawPoints final : Op {
@@ -485,13 +494,21 @@ namespace {
     };
     struct DrawVertices final : Op {
         static const auto kType = Type::DrawVertices;
-        DrawVertices(SkCanvas::VertexMode mode, int count, SkXfermode* xfermode, int nindices,
+        DrawVertices(SkCanvas::VertexMode mode, int count, SK_XFERMODE_PARAM xfermode, int nindices,
                      const SkPaint& paint, bool has_texs, bool has_colors, bool has_indices)
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_PARAM
             : mode(mode), count(count), xfermode(sk_ref_sp(xfermode)), nindices(nindices)
+#else
+            : mode(mode), count(count), xfermode(xfermode), nindices(nindices)
+#endif
             , paint(paint), has_texs(has_texs), has_colors(has_colors), has_indices(has_indices) {}
         SkCanvas::VertexMode mode;
         int                  count;
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_PARAM
         sk_sp<SkXfermode>    xfermode;
+#else
+        SkBlendMode          xfermode;
+#endif
         int                  nindices;
         SkPaint              paint;
         bool                 has_texs;
@@ -517,13 +534,13 @@ namespace {
             if (has_indices) {
                 indices = pod<uint16_t>(this, offset);
             }
-            c->drawVertices(mode, count, vertices, texs, colors, xfermode.get(),
+            c->drawVertices(mode, count, vertices, texs, colors, xfermode,
                             indices, nindices, paint);
         }
     };
     struct DrawAtlas final : Op {
         static const auto kType = Type::DrawAtlas;
-        DrawAtlas(const SkImage* atlas, int count, SkXfermode::Mode xfermode,
+        DrawAtlas(const SkImage* atlas, int count, SK_XFERMODE_MODE_PARAM xfermode,
                   const SkRect* cull, const SkPaint* paint, bool has_colors)
             : atlas(sk_ref_sp(atlas)), count(count), xfermode(xfermode), has_colors(has_colors) {
             if (cull)  { this->cull  = *cull; }
@@ -531,7 +548,7 @@ namespace {
         }
         sk_sp<const SkImage> atlas;
         int                  count;
-        SkXfermode::Mode     xfermode;
+        SK_XFERMODE_MODE_PARAM     xfermode;
         SkRect               cull = kUnset;
         SkPaint              paint;
         bool                 has_colors;
@@ -711,7 +728,7 @@ void SkLiteDL::drawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, cons
 }
 
 void SkLiteDL::drawPatch(const SkPoint points[12], const SkColor colors[4], const SkPoint texs[4],
-                         SkXfermode* xfermode, const SkPaint& paint) {
+                         SK_XFERMODE_PARAM xfermode, const SkPaint& paint) {
     this->push<DrawPatch>(0, points, colors, texs, xfermode, paint);
 }
 void SkLiteDL::drawPoints(SkCanvas::PointMode mode, size_t count, const SkPoint points[],
@@ -720,7 +737,7 @@ void SkLiteDL::drawPoints(SkCanvas::PointMode mode, size_t count, const SkPoint
     copy_v(pod, points,count);
 }
 void SkLiteDL::drawVertices(SkCanvas::VertexMode mode, int count, const SkPoint vertices[],
-                            const SkPoint texs[], const SkColor colors[], SkXfermode* xfermode,
+                            const SkPoint texs[], const SkColor colors[], SK_XFERMODE_PARAM xfermode,
                             const uint16_t indices[], int nindices, const SkPaint& paint) {
     size_t bytes = count * sizeof(SkPoint);
     if (texs  )  { bytes += count    * sizeof(SkPoint); }
@@ -734,7 +751,7 @@ void SkLiteDL::drawVertices(SkCanvas::VertexMode mode, int count, const SkPoint
                  indices, indices ? nindices : 0);
 }
 void SkLiteDL::drawAtlas(const SkImage* atlas, const SkRSXform xforms[], const SkRect texs[],
-                         const SkColor colors[], int count, SkXfermode::Mode xfermode,
+                         const SkColor colors[], int count, SK_XFERMODE_MODE_PARAM xfermode,
                          const SkRect* cull, const SkPaint* paint) {
     size_t bytes = count*(sizeof(SkRSXform) + sizeof(SkRect));
     if (colors) {
index 3e9eb5e..30211a6 100644 (file)
@@ -78,12 +78,12 @@ public:
                           const SkRect&, const SkPaint*);
 
     void drawPatch(const SkPoint[12], const SkColor[4], const SkPoint[4],
-                   SkXfermode*, const SkPaint&);
+                   SK_XFERMODE_PARAM, const SkPaint&);
     void drawPoints(SkCanvas::PointMode, size_t, const SkPoint[], const SkPaint&);
     void drawVertices(SkCanvas::VertexMode, int, const SkPoint[], const SkPoint[], const SkColor[],
-                      SkXfermode*, const uint16_t[], int, const SkPaint&);
+                      SK_XFERMODE_PARAM, const uint16_t[], int, const SkPaint&);
     void drawAtlas(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[], int,
-                   SkXfermode::Mode, const SkRect*, const SkPaint*);
+                   SK_XFERMODE_MODE_PARAM, const SkRect*, const SkPaint*);
 
     void setBounds(const SkRect& bounds);
 
index 49b1984..4c3de18 100644 (file)
@@ -171,7 +171,7 @@ void SkLiteRecorder::onDrawImageLattice(const SkImage* img,
 
 void SkLiteRecorder::onDrawPatch(const SkPoint cubics[12],
                                  const SkColor colors[4], const SkPoint texCoords[4],
-                                 SkXfermode* xfermode, const SkPaint& paint) {
+                                 SK_XFERMODE_PARAM xfermode, const SkPaint& paint) {
     fDL->drawPatch(cubics, colors, texCoords, xfermode, paint);
 }
 void SkLiteRecorder::onDrawPoints(SkCanvas::PointMode mode,
@@ -182,7 +182,7 @@ void SkLiteRecorder::onDrawPoints(SkCanvas::PointMode mode,
 void SkLiteRecorder::onDrawVertices(SkCanvas::VertexMode mode,
                                     int count, const SkPoint vertices[],
                                     const SkPoint texs[], const SkColor colors[],
-                                    SkXfermode* xfermode,
+                                    SK_XFERMODE_PARAM xfermode,
                                     const uint16_t indices[], int indexCount,
                                     const SkPaint& paint) {
     fDL->drawVertices(mode, count, vertices, texs, colors, xfermode, indices, indexCount, paint);
@@ -192,7 +192,7 @@ void SkLiteRecorder::onDrawAtlas(const SkImage* atlas,
                                  const SkRect texs[],
                                  const SkColor colors[],
                                  int count,
-                                 SkXfermode::Mode xfermode,
+                                 SK_XFERMODE_MODE_PARAM xfermode,
                                  const SkRect* cull,
                                  const SkPaint* paint) {
     fDL->drawAtlas(atlas, xforms, texs, colors, count, xfermode, cull, paint);
index be27854..9010a42 100644 (file)
@@ -72,12 +72,12 @@ public:
                          SrcRectConstraint) override;
 
     void onDrawPatch(const SkPoint[12], const SkColor[4],
-                     const SkPoint[4], SkXfermode*, const SkPaint&) override;
+                     const SkPoint[4], SK_XFERMODE_PARAM, const SkPaint&) override;
     void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&) override;
     void onDrawVertices(VertexMode, int, const SkPoint[], const SkPoint[], const SkColor[],
-                        SkXfermode*, const uint16_t[], int, const SkPaint&) override;
+                        SK_XFERMODE_PARAM, const uint16_t[], int, const SkPaint&) override;
     void onDrawAtlas(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[],
-                     int, SkXfermode::Mode, const SkRect*, const SkPaint*) override;
+                     int, SK_XFERMODE_MODE_PARAM, const SkRect*, const SkPaint*) override;
 
 #ifdef SK_EXPERIMENTAL_SHADOWING
     void didTranslateZ(SkScalar) override;
index f000e7c..acfd328 100644 (file)
@@ -29,12 +29,12 @@ void SkModeColorFilter::toString(SkString* str) const {
 }
 #endif
 
-bool SkModeColorFilter::asColorMode(SkColor* color, SkXfermode::Mode* mode) const {
+bool SkModeColorFilter::asColorMode(SkColor* color, SK_XFERMODE_MODE_PARAM* mode) const {
     if (color) {
         *color = fColor;
     }
     if (mode) {
-        *mode = fMode;
+        *mode = (SK_XFERMODE_MODE_PARAM)fMode;
     }
     return true;
 }
@@ -42,8 +42,8 @@ bool SkModeColorFilter::asColorMode(SkColor* color, SkXfermode::Mode* mode) cons
 uint32_t SkModeColorFilter::getFlags() const {
     uint32_t flags = 0;
     switch (fMode) {
-        case SkXfermode::kDst_Mode:      //!< [Da, Dc]
-        case SkXfermode::kSrcATop_Mode:  //!< [Da, Sc * Da + (1 - Sa) * Dc]
+        case SkBlendMode::kDst:      //!< [Da, Dc]
+        case SkBlendMode::kSrcATop:  //!< [Da, Sc * Da + (1 - Sa) * Dc]
             flags |= kAlphaUnchanged_Flag;
         default:
             break;
@@ -61,7 +61,7 @@ void SkModeColorFilter::filterSpan(const SkPMColor shader[], int count, SkPMColo
 }
 
 void SkModeColorFilter::filterSpan4f(const SkPM4f shader[], int count, SkPM4f result[]) const {
-    SkXfermodeProc4f  proc = SkXfermode::GetProc4f(fMode);
+    SkXfermodeProc4f  proc = SkXfermode::GetProc4f((SkXfermode::Mode)fMode);
 
     for (int i = 0; i < count; i++) {
         result[i] = proc(fPM4f, shader[i]);
@@ -70,18 +70,18 @@ void SkModeColorFilter::filterSpan4f(const SkPM4f shader[], int count, SkPM4f re
 
 void SkModeColorFilter::flatten(SkWriteBuffer& buffer) const {
     buffer.writeColor(fColor);
-    buffer.writeUInt(fMode);
+    buffer.writeUInt((int)fMode);
 }
 
 void SkModeColorFilter::updateCache() {
     fPMColor = SkPreMultiplyColor(fColor);
-    fProc = SkXfermode::GetProc(fMode);
+    fProc = SkXfermode::GetProc((SkXfermode::Mode)fMode);
     fPM4f = SkColor4f::FromColor(fColor).premul();
 }
 
 sk_sp<SkFlattenable> SkModeColorFilter::CreateProc(SkReadBuffer& buffer) {
     SkColor color = buffer.readColor();
-    SkXfermode::Mode mode = (SkXfermode::Mode)buffer.readUInt();
+    SkBlendMode mode = (SkBlendMode)buffer.readUInt();
     return SkColorFilter::MakeModeFilter(color, mode);
 }
 
@@ -108,7 +108,7 @@ bool SkModeColorFilter::onAppendStages(SkRasterPipeline* p) const {
 
 sk_sp<GrFragmentProcessor> SkModeColorFilter::asFragmentProcessor(
                                                     GrContext*, SkColorSpace* dstColorSpace) const {
-    if (SkXfermode::kDst_Mode == fMode) {
+    if (SkBlendMode::kDst == fMode) {
         return nullptr;
     }
 
@@ -123,7 +123,7 @@ sk_sp<GrFragmentProcessor> SkModeColorFilter::asFragmentProcessor(
 #ifdef SK_DEBUG
     // With a solid color input this should always be able to compute the blended color
     // (at least for coeff modes)
-    if (fMode <= SkXfermode::kLastCoeffMode) {
+    if ((unsigned)fMode <= (unsigned)SkBlendMode::kLastCoeffMode) {
         static SkRandom gRand;
         GrInvariantOutput io(GrPremulColor(gRand.nextU()), kRGBA_GrColorComponentFlags,
                                 false);
@@ -140,7 +140,7 @@ sk_sp<GrFragmentProcessor> SkModeColorFilter::asFragmentProcessor(
 
 class Src_SkModeColorFilter final : public SkModeColorFilter {
 public:
-    Src_SkModeColorFilter(SkColor color) : INHERITED(color, SkXfermode::kSrc_Mode) {}
+    Src_SkModeColorFilter(SkColor color) : INHERITED(color, SkBlendMode::kSrc) {}
 
     void filterSpan(const SkPMColor shader[], int count, SkPMColor result[]) const override {
         sk_memset32(result, this->getPMColor(), count);
@@ -152,7 +152,7 @@ private:
 
 class SrcOver_SkModeColorFilter final : public SkModeColorFilter {
 public:
-    SrcOver_SkModeColorFilter(SkColor color) : INHERITED(color, SkXfermode::kSrcOver_Mode) { }
+    SrcOver_SkModeColorFilter(SkColor color) : INHERITED(color, SkBlendMode::kSrcOver) { }
 
     void filterSpan(const SkPMColor shader[], int count, SkPMColor result[]) const override {
         SkBlitRow::Color32(result, shader, count, this->getPMColor());
@@ -164,7 +164,7 @@ private:
 
 ///////////////////////////////////////////////////////////////////////////////
 
-sk_sp<SkColorFilter> SkColorFilter::MakeModeFilter(SkColor color, SkXfermode::Mode mode) {
+sk_sp<SkColorFilter> SkColorFilter::MakeModeFilter(SkColor color, SkBlendMode mode) {
     if (!SkIsValidMode(mode)) {
         return nullptr;
     }
@@ -173,34 +173,34 @@ sk_sp<SkColorFilter> SkColorFilter::MakeModeFilter(SkColor color, SkXfermode::Mo
 
     // first collaps some modes if possible
 
-    if (SkXfermode::kClear_Mode == mode) {
+    if (SkBlendMode::kClear == mode) {
         color = 0;
-        mode = SkXfermode::kSrc_Mode;
-    } else if (SkXfermode::kSrcOver_Mode == mode) {
+        mode = SkBlendMode::kSrc;
+    } else if (SkBlendMode::kSrcOver == mode) {
         if (0 == alpha) {
-            mode = SkXfermode::kDst_Mode;
+            mode = SkBlendMode::kDst;
         } else if (255 == alpha) {
-            mode = SkXfermode::kSrc_Mode;
+            mode = SkBlendMode::kSrc;
         }
         // else just stay srcover
     }
 
     // weed out combinations that are noops, and just return null
-    if (SkXfermode::kDst_Mode == mode ||
-        (0 == alpha && (SkXfermode::kSrcOver_Mode == mode ||
-                        SkXfermode::kDstOver_Mode == mode ||
-                        SkXfermode::kDstOut_Mode == mode ||
-                        SkXfermode::kSrcATop_Mode == mode ||
-                        SkXfermode::kXor_Mode == mode ||
-                        SkXfermode::kDarken_Mode == mode)) ||
-            (0xFF == alpha && SkXfermode::kDstIn_Mode == mode)) {
+    if (SkBlendMode::kDst == mode ||
+        (0 == alpha && (SkBlendMode::kSrcOver == mode ||
+                        SkBlendMode::kDstOver == mode ||
+                        SkBlendMode::kDstOut == mode ||
+                        SkBlendMode::kSrcATop == mode ||
+                        SkBlendMode::kXor == mode ||
+                        SkBlendMode::kDarken == mode)) ||
+            (0xFF == alpha && SkBlendMode::kDstIn == mode)) {
         return nullptr;
     }
 
     switch (mode) {
-        case SkXfermode::kSrc_Mode:
+        case SkBlendMode::kSrc:
             return sk_make_sp<Src_SkModeColorFilter>(color);
-        case SkXfermode::kSrcOver_Mode:
+        case SkBlendMode::kSrcOver:
             return sk_make_sp<SrcOver_SkModeColorFilter>(color);
         default:
             return SkModeColorFilter::Make(color, mode);
index cd8fe7c..afb96e2 100644 (file)
 
 class SkModeColorFilter : public SkColorFilter {
 public:
-    static sk_sp<SkColorFilter> Make(SkColor color, SkXfermode::Mode mode) {
+    static sk_sp<SkColorFilter> Make(SkColor color, SkBlendMode mode) {
         return sk_sp<SkColorFilter>(new SkModeColorFilter(color, mode));
     }
 
     SkColor getColor() const { return fColor; }
-    SkXfermode::Mode getMode() const { return fMode; }
+    SkBlendMode getMode() const { return fMode; }
     SkPMColor getPMColor() const { return fPMColor; }
 
-    bool asColorMode(SkColor*, SkXfermode::Mode*) const override;
+    bool asColorMode(SkColor*, SK_XFERMODE_MODE_PARAM*) const override;
     uint32_t getFlags() const override;
     void filterSpan(const SkPMColor shader[], int count, SkPMColor result[]) const override;
     void filterSpan4f(const SkPM4f shader[], int count, SkPM4f result[]) const override;
@@ -37,7 +37,7 @@ public:
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkModeColorFilter)
 
 protected:
-    SkModeColorFilter(SkColor color, SkXfermode::Mode mode) {
+    SkModeColorFilter(SkColor color, SkBlendMode mode) {
         fColor = color;
         fMode = mode;
         this->updateCache();
@@ -49,7 +49,7 @@ protected:
 
 private:
     SkColor             fColor;
-    SkXfermode::Mode    fMode;
+    SkBlendMode         fMode;
     // cache
     SkPMColor           fPMColor;
     SkXfermodeProc      fProc;
index 8e1b7fe..76ca68a 100644 (file)
@@ -25,7 +25,7 @@ namespace SkOpts {
     // Declare function pointers here...
 
     // May return nullptr if we haven't specialized the given Mode.
-    extern SkXfermode* (*create_xfermode)(const ProcCoeff&, SkXfermode::Mode);
+    extern SkXfermode* (*create_xfermode)(const ProcCoeff&, SkBlendMode);
 
     typedef void (*BoxBlur)(const SkPMColor*, int, const SkIRect& srcBounds, SkPMColor*, int, int, int, int, int);
     extern BoxBlur box_blur_xx, box_blur_xy, box_blur_yx;
index bede601..51e1c98 100644 (file)
@@ -232,10 +232,10 @@ void SkPicturePlayback::handleOp(SkReadBuffer* reader,
             const SkRSXform* xform = (const SkRSXform*)reader->skip(count * sizeof(SkRSXform));
             const SkRect* tex = (const SkRect*)reader->skip(count * sizeof(SkRect));
             const SkColor* colors = nullptr;
-            SkXfermode::Mode mode = SkXfermode::kDst_Mode;
+            SkBlendMode mode = SkBlendMode::kDst;
             if (flags & DRAW_ATLAS_HAS_COLORS) {
                 colors = (const SkColor*)reader->skip(count * sizeof(SkColor));
-                mode = (SkXfermode::Mode)reader->readUInt();
+                mode = (SkBlendMode)reader->readUInt();
             }
             const SkRect* cull = nullptr;
             if (flags & DRAW_ATLAS_HAS_CULL) {
@@ -436,18 +436,17 @@ void SkPicturePlayback::handleOp(SkReadBuffer* reader,
                 texCoords = (const SkPoint*)reader->skip(SkPatchUtils::kNumCorners *
                                                          sizeof(SkPoint));
             }
-            sk_sp<SkXfermode> xfer;
+            SkBlendMode bmode = SkBlendMode::kModulate;
             if (flag & DRAW_VERTICES_HAS_XFER) {
-                int mode = reader->readInt();
-                if (mode < 0 || mode > SkXfermode::kLastMode) {
-                    mode = SkXfermode::kModulate_Mode;
+                unsigned mode = reader->readInt();
+                if (mode <= (unsigned)SkBlendMode::kLastMode) {
+                    bmode = (SkBlendMode)mode;
                 }
-                xfer = SkXfermode::Make((SkXfermode::Mode)mode);
             }
             BREAK_ON_READ_ERROR(reader);
 
             if (paint) {
-                canvas->drawPatch(cubics, colors, texCoords, std::move(xfer), *paint);
+                canvas->drawPatch(cubics, colors, texCoords, bmode, *paint);
             }
         } break;
         case DRAW_PATH: {
@@ -653,7 +652,6 @@ void SkPicturePlayback::handleOp(SkReadBuffer* reader,
             }
         } break;
         case DRAW_VERTICES: {
-            sk_sp<SkXfermode> xfer;
             const SkPaint* paint = fPictureData->getPaint(reader);
             DrawVertexFlags flags = (DrawVertexFlags)reader->readInt();
             SkCanvas::VertexMode vmode = (SkCanvas::VertexMode)reader->readInt();
@@ -673,18 +671,18 @@ void SkPicturePlayback::handleOp(SkReadBuffer* reader,
                 iCount = reader->readInt();
                 indices = (const uint16_t*)reader->skip(iCount * sizeof(uint16_t));
             }
+            SkBlendMode bmode = SkBlendMode::kModulate;
             if (flags & DRAW_VERTICES_HAS_XFER) {
-                int mode = reader->readInt();
-                if (mode < 0 || mode > SkXfermode::kLastMode) {
-                    mode = SkXfermode::kModulate_Mode;
+                unsigned mode = reader->readInt();
+                if (mode <= (unsigned)SkBlendMode::kLastMode) {
+                    bmode = (SkBlendMode)mode;
                 }
-                xfer = SkXfermode::Make((SkXfermode::Mode)mode);
             }
             BREAK_ON_READ_ERROR(reader);
 
             if (paint) {
                 canvas->drawVertices(vmode, vCount, verts, texs, colors,
-                                     xfer, indices, iCount, *paint);
+                                     bmode, indices, iCount, *paint);
             }
         } break;
         case RESTORE:
index 6325eda..8b8ee23 100644 (file)
@@ -722,7 +722,7 @@ void SkPictureRecord::onDrawDrawable(SkDrawable* drawable, const SkMatrix* matri
 
 void SkPictureRecord::onDrawVertices(VertexMode vmode, int vertexCount,
                                      const SkPoint vertices[], const SkPoint texs[],
-                                     const SkColor colors[], SkXfermode* xfer,
+                                     const SkColor colors[], SK_XFERMODE_PARAM xmode,
                                      const uint16_t indices[], int indexCount,
                                      const SkPaint& paint) {
     uint32_t flags = 0;
@@ -735,11 +735,16 @@ void SkPictureRecord::onDrawVertices(VertexMode vmode, int vertexCount,
     if (indexCount > 0) {
         flags |= DRAW_VERTICES_HAS_INDICES;
     }
-    if (xfer) {
-        SkXfermode::Mode mode;
-        if (xfer->asMode(&mode) && SkXfermode::kModulate_Mode != mode) {
-            flags |= DRAW_VERTICES_HAS_XFER;
-        }
+    SkBlendMode bmode = SkBlendMode::kModulate;
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_PARAM
+    if (xmode) {
+        bmode = xmode->blend();
+    }
+#else
+    bmode = xmode;
+#endif
+    if (SkBlendMode::kModulate != bmode) {
+        flags |= DRAW_VERTICES_HAS_XFER;
     }
 
     // op + paint index + flags + vmode + vCount + vertices
@@ -775,15 +780,13 @@ void SkPictureRecord::onDrawVertices(VertexMode vmode, int vertexCount,
         fWriter.writePad(indices, indexCount * sizeof(uint16_t));
     }
     if (flags & DRAW_VERTICES_HAS_XFER) {
-        SkXfermode::Mode mode = SkXfermode::kModulate_Mode;
-        (void)xfer->asMode(&mode);
-        this->addInt(mode);
+        this->addInt((int)bmode);
     }
     this->validate(initialOffset, size);
 }
 
 void SkPictureRecord::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
-                                  const SkPoint texCoords[4], SkXfermode* xmode,
+                                  const SkPoint texCoords[4], SK_XFERMODE_PARAM xmode,
                                   const SkPaint& paint) {
     // op + paint index + patch 12 control points + flag + patch 4 colors + 4 texture coordinates
     size_t size = 2 * kUInt32Size + SkPatchUtils::kNumCtrlPts * sizeof(SkPoint) + kUInt32Size;
@@ -796,12 +799,17 @@ void SkPictureRecord::onDrawPatch(const SkPoint cubics[12], const SkColor colors
         flag |= DRAW_VERTICES_HAS_TEXS;
         size += SkPatchUtils::kNumCorners * sizeof(SkPoint);
     }
+    SkBlendMode bmode = SkBlendMode::kModulate;
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_PARAM
     if (xmode) {
-        SkXfermode::Mode mode;
-        if (xmode->asMode(&mode) && SkXfermode::kModulate_Mode != mode) {
-            flag |= DRAW_VERTICES_HAS_XFER;
-            size += kUInt32Size;
-        }
+        bmode = xmode->blend();
+    }
+#else
+    bmode = xmode;
+#endif
+    if (SkBlendMode::kModulate != bmode) {
+        flag |= DRAW_VERTICES_HAS_XFER;
+        size += kUInt32Size;
     }
 
     size_t initialOffset = this->addDraw(DRAW_PATCH, &size);
@@ -817,15 +825,13 @@ void SkPictureRecord::onDrawPatch(const SkPoint cubics[12], const SkColor colors
         fWriter.write(texCoords, SkPatchUtils::kNumCorners * sizeof(SkPoint));
     }
     if (flag & DRAW_VERTICES_HAS_XFER) {
-        SkXfermode::Mode mode = SkXfermode::kModulate_Mode;
-        xmode->asMode(&mode);
-        this->addInt(mode);
+        this->addInt((int)bmode);
     }
     this->validate(initialOffset, size);
 }
 
 void SkPictureRecord::onDrawAtlas(const SkImage* atlas, const SkRSXform xform[], const SkRect tex[],
-                                  const SkColor colors[], int count, SkXfermode::Mode mode,
+                                  const SkColor colors[], int count, SK_XFERMODE_MODE_PARAM mode,
                                   const SkRect* cull, const SkPaint* paint) {
     // [op + paint-index + atlas-index + flags + count] + [xform] + [tex] + [*colors + mode] + cull
     size_t size = 5 * kUInt32Size + count * sizeof(SkRSXform) + count * sizeof(SkRect);
@@ -851,7 +857,7 @@ void SkPictureRecord::onDrawAtlas(const SkImage* atlas, const SkRSXform xform[],
     // write optional parameters
     if (colors) {
         fWriter.write(colors, count * sizeof(SkColor));
-        this->addInt(mode);
+        this->addInt((int)mode);
     }
     if (cull) {
         fWriter.write(cull, sizeof(SkRect));
index 6d75609..0db9b8b 100644 (file)
@@ -178,10 +178,10 @@ protected:
                                 const SkPaint& paint) override;
 
     void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
-                             const SkPoint texCoords[4], SkXfermode* xmode,
+                             const SkPoint texCoords[4], SK_XFERMODE_PARAM xmode,
                              const SkPaint& paint) override;
     void onDrawAtlas(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[], int,
-                     SkXfermode::Mode, const SkRect*, const SkPaint*) override;
+                     SK_XFERMODE_MODE_PARAM, const SkRect*, const SkPaint*) override;
 
     void onDrawPaint(const SkPaint&) override;
     void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&) override;
@@ -201,7 +201,7 @@ protected:
 
     void onDrawVertices(VertexMode vmode, int vertexCount,
                         const SkPoint vertices[], const SkPoint texs[],
-                        const SkColor colors[], SkXfermode* xmode,
+                        const SkColor colors[], SK_XFERMODE_PARAM xmode,
                         const uint16_t indices[], int indexCount,
                         const SkPaint&) override;
 
index 6b0d332..c49b01c 100644 (file)
@@ -70,6 +70,7 @@ public:
         kBlurMaskFilterWritesOccluder      = 47,
         kGradientShaderFloatColor_Version  = 49,
         kXfermodeToBlendMode_Version       = 50,
+        kXfermodeToBlendMode2_Version      = 51,
     };
 
     /**
index dca19df..05261bb 100644 (file)
@@ -116,7 +116,7 @@ DRAW(DrawImageNine, drawImageNine(r.image.get(), r.center, r.dst, r.paint));
 DRAW(DrawOval, drawOval(r.oval, r.paint));
 DRAW(DrawPaint, drawPaint(r.paint));
 DRAW(DrawPath, drawPath(r.path, r.paint));
-DRAW(DrawPatch, drawPatch(r.cubics, r.colors, r.texCoords, r.xmode, r.paint));
+DRAW(DrawPatch, drawPatch(r.cubics, r.colors, r.texCoords, r.bmode, r.paint));
 DRAW(DrawPicture, drawPicture(r.picture.get(), &r.matrix, r.paint));
 
 #ifdef SK_EXPERIMENTAL_SHADOWING
@@ -138,7 +138,7 @@ DRAW(DrawTextRSXform, drawTextRSXform(r.text, r.byteLength, r.xforms, r.cull, r.
 DRAW(DrawAtlas, drawAtlas(r.atlas.get(),
                           r.xforms, r.texs, r.colors, r.count, r.mode, r.cull, r.paint));
 DRAW(DrawVertices, drawVertices(r.vmode, r.vertexCount, r.vertices, r.texs, r.colors,
-                                r.xmode, r.indices, r.indexCount, r.paint));
+                                r.bmode, r.indices, r.indexCount, r.paint));
 DRAW(DrawAnnotation, drawAnnotation(r.rect, r.key.c_str(), r.value.get()));
 #undef DRAW
 
index 08c7370..5720186 100644 (file)
@@ -330,30 +330,41 @@ void SkRecorder::onDrawShadowedPicture(const SkPicture* pic, const SkMatrix* mat
 void SkRecorder::onDrawVertices(VertexMode vmode,
                                 int vertexCount, const SkPoint vertices[],
                                 const SkPoint texs[], const SkColor colors[],
-                                SkXfermode* xmode,
+                                SK_XFERMODE_PARAM xmode,
                                 const uint16_t indices[], int indexCount, const SkPaint& paint) {
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_PARAM
+    SkBlendMode bmode = xmode ? xmode->blend() : SkBlendMode::kModulate;
+#else
+    SkBlendMode bmode = xmode;
+#endif
     APPEND(DrawVertices, paint,
                          vmode,
                          vertexCount,
                          this->copy(vertices, vertexCount),
                          texs ? this->copy(texs, vertexCount) : nullptr,
                          colors ? this->copy(colors, vertexCount) : nullptr,
-                         sk_ref_sp(xmode),
+                         bmode,
                          this->copy(indices, indexCount),
                          indexCount);
 }
 
 void SkRecorder::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
-                             const SkPoint texCoords[4], SkXfermode* xmode, const SkPaint& paint) {
+                             const SkPoint texCoords[4], SK_XFERMODE_PARAM xmode,
+                             const SkPaint& paint) {
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_PARAM
+    SkBlendMode bmode = xmode ? xmode->blend() : SkBlendMode::kModulate;
+#else
+    SkBlendMode bmode = xmode;
+#endif
     APPEND(DrawPatch, paint,
            cubics ? this->copy(cubics, SkPatchUtils::kNumCtrlPts) : nullptr,
            colors ? this->copy(colors, SkPatchUtils::kNumCorners) : nullptr,
            texCoords ? this->copy(texCoords, SkPatchUtils::kNumCorners) : nullptr,
-           sk_ref_sp(xmode));
+           bmode);
 }
 
 void SkRecorder::onDrawAtlas(const SkImage* atlas, const SkRSXform xform[], const SkRect tex[],
-                             const SkColor colors[], int count, SkXfermode::Mode mode,
+                             const SkColor colors[], int count, SK_XFERMODE_MODE_PARAM mode,
                              const SkRect* cull, const SkPaint* paint) {
     APPEND(DrawAtlas, this->copy(paint),
            sk_ref_sp(atlas),
@@ -361,7 +372,7 @@ void SkRecorder::onDrawAtlas(const SkImage* atlas, const SkRSXform xform[], cons
            this->copy(tex, count),
            this->copy(colors, count),
            count,
-           mode,
+           (SkBlendMode)mode,
            this->copy(cull));
 }
 
index 715fc93..7015167 100644 (file)
@@ -99,7 +99,7 @@ public:
                         SkScalar y,
                         const SkPaint& paint) override;
     void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
-                     const SkPoint texCoords[4], SkXfermode* xmode,
+                     const SkPoint texCoords[4], SK_XFERMODE_PARAM xmode,
                      const SkPaint& paint) override;
 
     void onDrawPaint(const SkPaint&) override;
@@ -126,11 +126,11 @@ public:
                              const SkPaint*) override;
     void onDrawVertices(VertexMode vmode, int vertexCount,
                         const SkPoint vertices[], const SkPoint texs[],
-                        const SkColor colors[], SkXfermode* xmode,
+                        const SkColor colors[], SK_XFERMODE_PARAM xmode,
                         const uint16_t indices[], int indexCount,
                         const SkPaint&) override;
     void onDrawAtlas(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[],
-                     int count, SkXfermode::Mode, const SkRect* cull, const SkPaint*) override;
+                     int count, SK_XFERMODE_MODE_PARAM, const SkRect* cull, const SkPaint*) override;
 
     void onClipRect(const SkRect& rect, ClipOp, ClipEdgeStyle) override;
     void onClipRRect(const SkRRect& rrect, ClipOp, ClipEdgeStyle) override;
index e9e5986..d71666c 100644 (file)
@@ -9,7 +9,7 @@
 #define SkValidationUtils_DEFINED
 
 #include "SkBitmap.h"
-#include "SkXfermode.h"
+#include "SkBlendMode.h"
 
 /** Returns true if coeff's value is in the SkXfermode::Coeff enum.
   */
@@ -17,10 +17,10 @@ static inline bool SkIsValidCoeff(SkXfermode::Coeff coeff) {
     return coeff >= 0 && coeff < SkXfermode::kCoeffCount;
 }
 
-/** Returns true if mode's value is in the SkXfermode::Mode enum.
+/** Returns true if mode's value is in the SkBlendMode enum.
   */
-static inline bool SkIsValidMode(SkXfermode::Mode mode) {
-    return (mode >= 0) && (mode <= SkXfermode::kLastMode);
+static inline bool SkIsValidMode(SkBlendMode mode) {
+    return (unsigned)mode <= (unsigned)SkBlendMode::kLastMode;
 }
 
 /** Returns true if the rect's dimensions are between 0 and SK_MaxS32
index 7180824..8632fdf 100644 (file)
@@ -1109,12 +1109,12 @@ sk_sp<SkFlattenable> SkProcCoeffXfermode::CreateProc(SkReadBuffer& buffer) {
 }
 
 void SkProcCoeffXfermode::flatten(SkWriteBuffer& buffer) const {
-    buffer.write32(fMode);
+    buffer.write32((int)fMode);
 }
 
 bool SkProcCoeffXfermode::asMode(Mode* mode) const {
     if (mode) {
-        *mode = fMode;
+        *mode = (Mode)fMode;
     }
     return true;
 }
@@ -1307,32 +1307,33 @@ void SkProcCoeffXfermode::toString(SkString* str) const {
 #endif
 
 
-sk_sp<SkXfermode> SkXfermode::Make(Mode mode) {
-    if ((unsigned)mode >= kModeCount) {
+sk_sp<SkXfermode> SkXfermode::Make(SkBlendMode mode) {
+    if ((unsigned)mode > (unsigned)SkBlendMode::kLastMode) {
         // report error
         return nullptr;
     }
 
     // Skia's "default" mode is srcover. nullptr in SkPaint is interpreted as srcover
     // so we can just return nullptr from the factory.
-    if (kSrcOver_Mode == mode) {
+    if (SkBlendMode::kSrcOver == mode) {
         return nullptr;
     }
 
-    SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount);
+    const int COUNT_BLENDMODES = (int)SkBlendMode::kLastMode + 1;
+    SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == COUNT_BLENDMODES);
 
-    static SkOnce        once[SkXfermode::kLastMode+1];
-    static SkXfermode* cached[SkXfermode::kLastMode+1];
+    static SkOnce        once[COUNT_BLENDMODES];
+    static SkXfermode* cached[COUNT_BLENDMODES];
 
-    once[mode]([mode] {
-        ProcCoeff rec = gProcCoeffs[mode];
+    once[(int)mode]([mode] {
+        ProcCoeff rec = gProcCoeffs[(int)mode];
         if (auto xfermode = SkOpts::create_xfermode(rec, mode)) {
-            cached[mode] = xfermode;
+            cached[(int)mode] = xfermode;
         } else {
-            cached[mode] = new SkProcCoeffXfermode(rec, mode);
+            cached[(int)mode] = new SkProcCoeffXfermode(rec, mode);
         }
     });
-    return sk_ref_sp(cached[mode]);
+    return sk_ref_sp(cached[(int)mode]);
 }
 
 SkXfermodeProc SkXfermode::GetProc(Mode mode) {
@@ -1481,8 +1482,8 @@ sk_sp<GrXPFactory> SkBlendMode_AsXPFactory(SkBlendMode mode) {
         return result;
     }
 
-    SkASSERT(GrCustomXfermode::IsSupportedMode((SkXfermode::Mode)mode));
-    return GrCustomXfermode::MakeXPFactory((SkXfermode::Mode)mode);
+    SkASSERT(GrCustomXfermode::IsSupportedMode(mode));
+    return GrCustomXfermode::MakeXPFactory(mode);
 }
 #endif
 
index 357de43..8d70957 100644 (file)
@@ -23,7 +23,7 @@ struct ProcCoeff {
 
 class SK_API SkProcCoeffXfermode : public SkXfermode {
 public:
-    SkProcCoeffXfermode(const ProcCoeff& rec, Mode mode) {
+    SkProcCoeffXfermode(const ProcCoeff& rec, SkBlendMode mode) {
         fMode = mode;
         fProc = rec.fProc;
         // these may be valid, or may be CANNOT_USE_COEFF
@@ -56,13 +56,13 @@ public:
 protected:
     void flatten(SkWriteBuffer& buffer) const override;
 
-    Mode getMode() const { return fMode; }
+    SkBlendMode getMode() const { return fMode; }
 
     SkXfermodeProc getProc() const { return fProc; }
 
 private:
     SkXfermodeProc  fProc;
-    Mode            fMode;
+    SkBlendMode     fMode;
     Coeff           fSrcCoeff, fDstCoeff;
 
     friend class SkXfermode;
index 3058374..e554295 100644 (file)
@@ -44,7 +44,7 @@ void SkBlurDrawLooper::initEffects() {
         // be baked into the blurred mask.
         SkColor opaqueColor = SkColorSetA(fBlurColor, 255);
         //The SrcIn xfer mode will multiply 'color' by the incoming alpha
-        fColorFilter = SkColorFilter::MakeModeFilter(opaqueColor, SkXfermode::kSrcIn_Mode);
+        fColorFilter = SkColorFilter::MakeModeFilter(opaqueColor, SkBlendMode::kSrcIn);
     } else {
         fColorFilter = nullptr;
     }
index 32cb3d9..0a2f08f 100644 (file)
@@ -20,8 +20,7 @@ sk_sp<SkColorFilter> SkColorMatrixFilter::MakeLightingFilter(SkColor mul, SkColo
     const SkColor opaqueAlphaMask = SK_ColorBLACK;
     // omit the alpha and compare only the RGB values
     if (0 == (add & ~opaqueAlphaMask)) {
-        return SkColorFilter::MakeModeFilter(mul | opaqueAlphaMask,
-                                             SkXfermode::Mode::kModulate_Mode);
+        return SkColorFilter::MakeModeFilter(mul | opaqueAlphaMask, SkBlendMode::kModulate);
     }
 
     SkColorMatrix matrix;
index cc43db7..f2a41ee 100644 (file)
@@ -94,7 +94,7 @@ sk_sp<SkSpecialImage> SkDropShadowImageFilter::onFilterImage(SkSpecialImage* sou
 
     SkPaint paint;
     paint.setImageFilter(SkBlurImageFilter::Make(sigma.fX, sigma.fY, nullptr));
-    paint.setColorFilter(SkColorFilter::MakeModeFilter(fColor, SkXfermode::kSrcIn_Mode));
+    paint.setColorFilter(SkColorFilter::MakeModeFilter(fColor, SkBlendMode::kSrcIn));
 
     SkVector offsetVec = SkVector::Make(fDx, fDy);
     ctx.ctm().mapVectors(&offsetVec, 1);
index 784228f..51a3f77 100644 (file)
@@ -15,7 +15,7 @@
 
 SkLayerDrawLooper::LayerInfo::LayerInfo() {
     fPaintBits = 0;                     // ignore our paint fields
-    fColorMode = SkXfermode::kDst_Mode; // ignore our color
+    fColorMode = (SK_XFERMODE_MODE_PARAM)SkBlendMode::kDst; // ignore our color
     fOffset.set(0, 0);
     fPostTranslate = false;
 }
@@ -39,16 +39,16 @@ SkLayerDrawLooper::Context* SkLayerDrawLooper::createContext(SkCanvas* canvas, v
     return new (storage) LayerDrawLooperContext(this);
 }
 
-static SkColor xferColor(SkColor src, SkColor dst, SkXfermode::Mode mode) {
+static SkColor xferColor(SkColor src, SkColor dst, SkBlendMode mode) {
     switch (mode) {
-        case SkXfermode::kSrc_Mode:
+        case SkBlendMode::kSrc:
             return src;
-        case SkXfermode::kDst_Mode:
+        case SkBlendMode::kDst:
             return dst;
         default: {
             SkPMColor pmS = SkPreMultiplyColor(src);
             SkPMColor pmD = SkPreMultiplyColor(dst);
-            SkPMColor result = SkXfermode::GetProc(mode)(pmS, pmD);
+            SkPMColor result = SkXfermode::GetProc((SkXfermode::Mode)mode)(pmS, pmD);
             return SkUnPreMultiply::PMColorToColor(result);
         }
     }
@@ -60,7 +60,7 @@ static SkColor xferColor(SkColor src, SkColor dst, SkXfermode::Mode mode) {
 void SkLayerDrawLooper::LayerDrawLooperContext::ApplyInfo(
         SkPaint* dst, const SkPaint& src, const LayerInfo& info) {
 
-    dst->setColor(xferColor(src.getColor(), dst->getColor(), info.fColorMode));
+    dst->setColor(xferColor(src.getColor(), dst->getColor(), (SkBlendMode)info.fColorMode));
 
     BitFlags bits = info.fPaintBits;
     SkPaint::TextEncoding encoding = dst->getTextEncoding();
@@ -161,7 +161,7 @@ bool SkLayerDrawLooper::asABlurShadow(BlurShadowRec* bsRec) const {
     if ((rec->fInfo.fPaintBits & ~kMaskFilter_Bit)) {
         return false;
     }
-    if (SkXfermode::kSrc_Mode != rec->fInfo.fColorMode) {
+    if (SkBlendMode::kSrc != (SkBlendMode)rec->fInfo.fColorMode) {
         return false;
     }
     const SkMaskFilter* mf = rec->fPaint.getMaskFilter();
@@ -178,7 +178,7 @@ bool SkLayerDrawLooper::asABlurShadow(BlurShadowRec* bsRec) const {
     if (rec->fInfo.fPaintBits) {
         return false;
     }
-    if (SkXfermode::kDst_Mode != rec->fInfo.fColorMode) {
+    if (SkBlendMode::kDst != (SkBlendMode)rec->fInfo.fColorMode) {
         return false;
     }
     if (!rec->fInfo.fOffset.equals(0, 0)) {
@@ -206,7 +206,7 @@ void SkLayerDrawLooper::flatten(SkWriteBuffer& buffer) const {
         buffer.writeInt(0);
 
         buffer.writeInt(rec->fInfo.fPaintBits);
-        buffer.writeInt(rec->fInfo.fColorMode);
+        buffer.writeInt((int)rec->fInfo.fColorMode);
         buffer.writePoint(rec->fInfo.fOffset);
         buffer.writeBool(rec->fInfo.fPostTranslate);
         buffer.writePaint(rec->fPaint);
@@ -224,7 +224,7 @@ sk_sp<SkFlattenable> SkLayerDrawLooper::CreateProc(SkReadBuffer& buffer) {
         (void)buffer.readInt();
 
         info.fPaintBits = buffer.readInt();
-        info.fColorMode = (SkXfermode::Mode)buffer.readInt();
+        info.fColorMode = (SK_XFERMODE_MODE_PARAM)buffer.readInt();
         buffer.readPoint(&info.fOffset);
         info.fPostTranslate = buffer.readBool();
         buffer.readPaint(builder.addLayerOnTop(info));
@@ -262,14 +262,14 @@ void SkLayerDrawLooper::toString(SkString* str) const {
         }
         str->append(") ");
 
-        static const char* gModeStrings[SkXfermode::kLastMode+1] = {
+        static const char* gModeStrings[(int)SkBlendMode::kLastMode+1] = {
             "kClear", "kSrc", "kDst", "kSrcOver", "kDstOver", "kSrcIn", "kDstIn",
             "kSrcOut", "kDstOut", "kSrcATop", "kDstATop", "kXor", "kPlus",
             "kMultiply", "kScreen", "kOverlay", "kDarken", "kLighten", "kColorDodge",
             "kColorBurn", "kHardLight", "kSoftLight", "kDifference", "kExclusion"
         };
 
-        str->appendf("mode: %s ", gModeStrings[rec->fInfo.fColorMode]);
+        str->appendf("mode: %s ", gModeStrings[(int)rec->fInfo.fColorMode]);
 
         str->append("offset: (");
         str->appendScalar(rec->fInfo.fOffset.fX);
index 9830669..9043620 100644 (file)
 
 sk_sp<SkImageFilter> SkMergeImageFilter::Make(sk_sp<SkImageFilter> first,
                                               sk_sp<SkImageFilter> second,
-                                              SkXfermode::Mode mode,
+                                              SkBlendMode mode,
                                               const CropRect* cropRect) {
     sk_sp<SkImageFilter> inputs[2] = { first, second };
-    SkXfermode::Mode modes[2] = { mode, mode };
+    SkBlendMode modes[2] = { mode, mode };
     return sk_sp<SkImageFilter>(new SkMergeImageFilter(inputs, 2, modes, cropRect));
 }
 
-sk_sp<SkImageFilter> SkMergeImageFilter::Make(sk_sp<SkImageFilter> filters[],
-                                              int count,
-                                              const SkXfermode::Mode modes[],
-                                              const CropRect* cropRect) {
+sk_sp<SkImageFilter> SkMergeImageFilter::MakeN(sk_sp<SkImageFilter> filters[], int count,
+                                               const SkBlendMode modes[],
+                                               const CropRect* cropRect) {
     return sk_sp<SkImageFilter>(new SkMergeImageFilter(filters, count, modes, cropRect));
 }
 
@@ -46,12 +45,12 @@ void SkMergeImageFilter::initAllocModes() {
     }
 }
 
-void SkMergeImageFilter::initModes(const SkXfermode::Mode modes[]) {
+void SkMergeImageFilter::initModes(const SkBlendMode modes[]) {
     if (modes) {
         this->initAllocModes();
         int inputCount = this->countInputs();
         for (int i = 0; i < inputCount; ++i) {
-            fModes[i] = SkToU8(modes[i]);
+            fModes[i] = SkToU8((unsigned)modes[i]);
         }
     } else {
         fModes = nullptr;
@@ -59,7 +58,7 @@ void SkMergeImageFilter::initModes(const SkXfermode::Mode modes[]) {
 }
 
 SkMergeImageFilter::SkMergeImageFilter(sk_sp<SkImageFilter> filters[], int count,
-                                       const SkXfermode::Mode modes[],
+                                       const SkBlendMode modes[],
                                        const CropRect* cropRect)
     : INHERITED(filters, count, cropRect) {
     SkASSERT(count >= 0);
@@ -153,21 +152,21 @@ sk_sp<SkFlattenable> SkMergeImageFilter::CreateProc(SkReadBuffer& buffer) {
     const int count = common.inputCount();
     bool hasModes = buffer.readBool();
     if (hasModes) {
-        SkAutoSTArray<4, SkXfermode::Mode> modes(count);
+        SkAutoSTArray<4, SkBlendMode> modes(count);
         SkAutoSTArray<4, uint8_t> modes8(count);
         if (!buffer.readByteArray(modes8.get(), count)) {
             return nullptr;
         }
         for (int i = 0; i < count; ++i) {
-            modes[i] = (SkXfermode::Mode)modes8[i];
+            modes[i] = (SkBlendMode)modes8[i];
             buffer.validate(SkIsValidMode(modes[i]));
         }
         if (!buffer.isValid()) {
             return nullptr;
         }
-        return Make(common.inputs(), count, modes.get(), &common.cropRect());
+        return MakeN(common.inputs(), count, modes.get(), &common.cropRect());
     }
-    return Make(common.inputs(), count, nullptr, &common.cropRect());
+    return MakeN(common.inputs(), count, nullptr, &common.cropRect());
 }
 
 void SkMergeImageFilter::flatten(SkWriteBuffer& buffer) const {
index 6587b74..7484869 100644 (file)
@@ -333,7 +333,7 @@ SkXfermodeImageFilter_Base::makeFGFrag(sk_sp<GrFragmentProcessor> bgFP) const {
         rec.fProc = SkXfermode::GetProc(SkXfermode::kSrcOver_Mode);
         SkXfermode::ModeAsCoeff(SkXfermode::kSrcOver_Mode, &rec.fSC, &rec.fDC);
 
-        srcover.reset(new SkProcCoeffXfermode(rec, SkXfermode::kSrcOver_Mode));
+        srcover.reset(new SkProcCoeffXfermode(rec, SkBlendMode::kSrcOver));
         xfer = srcover.get();
 
     }
index 1844983..820b428 100644 (file)
@@ -104,8 +104,7 @@ sk_sp<GrFragmentProcessor> GrFragmentProcessor::MulOutputByInputAlpha(
     if (!fp) {
         return nullptr;
     }
-    return GrXfermodeFragmentProcessor::MakeFromDstProcessor(std::move(fp),
-                                                             SkXfermode::kDstIn_Mode);
+    return GrXfermodeFragmentProcessor::MakeFromDstProcessor(std::move(fp), SkBlendMode::kDstIn);
 }
 
 sk_sp<GrFragmentProcessor> GrFragmentProcessor::PremulInput(sk_sp<GrFragmentProcessor> fp) {
index 937910f..ad8adb0 100644 (file)
@@ -252,7 +252,7 @@ void GrRenderTargetContext::internalClear(const GrFixedClip& clip,
 
         GrPaint paint;
         paint.setColor4f(GrColor4f::FromGrColor(color));
-        paint.setXPFactory(GrPorterDuffXPFactory::Make(SkXfermode::Mode::kSrc_Mode));
+        paint.setXPFactory(GrPorterDuffXPFactory::Make(SkBlendMode::kSrc));
 
         this->drawRect(clip, paint, SkMatrix::I(), clearRect);
     } else if (isFull) {
index dbb4699..b49687f 100644 (file)
@@ -1564,7 +1564,7 @@ static const GrPrimitiveType gVertexMode2PrimitiveType[] = {
 void SkGpuDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode,
                               int vertexCount, const SkPoint vertices[],
                               const SkPoint texs[], const SkColor colors[],
-                              SkXfermode* xmode,
+                              SK_XFERMODE_PARAM xmode,
                               const uint16_t indices[], int indexCount,
                               const SkPaint& paint) {
     ASSERT_SINGLE_OWNER
@@ -1646,14 +1646,11 @@ void SkGpuDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode,
         if (colors) {
             // When there are texs and colors the shader and colors are combined using xmode. A null
             // xmode is defined to mean modulate.
-            SkXfermode::Mode colorMode;
-            if (xmode) {
-                if (!xmode->asMode(&colorMode)) {
-                    return;
-                }
-            } else {
-                colorMode = SkXfermode::kModulate_Mode;
-            }
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_PARAM
+            SkBlendMode colorMode = xmode ? xmode->blend() : SkBlendMode::kModulate;
+#else
+            SkBlendMode colorMode = xmode;
+#endif
             if (!SkPaintToGrPaintWithXfermode(this->context(), fRenderTargetContext.get(), paint,
                                               *draw.fMatrix, colorMode, false, &grPaint)) {
                 return;
@@ -1698,7 +1695,7 @@ void SkGpuDevice::drawVertices(const SkDraw& draw, SkCanvas::VertexMode vmode,
 
 void SkGpuDevice::drawAtlas(const SkDraw& draw, const SkImage* atlas, const SkRSXform xform[],
                             const SkRect texRect[], const SkColor colors[], int count,
-                            SkXfermode::Mode mode, const SkPaint& paint) {
+                            SK_XFERMODE_MODE_PARAM mode, const SkPaint& paint) {
     ASSERT_SINGLE_OWNER
     if (paint.isAntiAlias()) {
         this->INHERITED::drawAtlas(draw, atlas, xform, texRect, colors, count, mode, paint);
@@ -1714,7 +1711,7 @@ void SkGpuDevice::drawAtlas(const SkDraw& draw, const SkImage* atlas, const SkRS
     GrPaint grPaint;
     if (colors) {
         if (!SkPaintToGrPaintWithXfermode(this->context(), fRenderTargetContext.get(), p,
-                                          *draw.fMatrix, mode, true, &grPaint)) {
+                                          *draw.fMatrix, (SkBlendMode)mode, true, &grPaint)) {
             return;
         }
     } else {
index 0b50dee..77afda7 100644 (file)
@@ -92,10 +92,10 @@ public:
     void drawTextBlob(const SkDraw&, const SkTextBlob*, SkScalar x, SkScalar y,
                       const SkPaint& paint, SkDrawFilter* drawFilter) override;
     void drawVertices(const SkDraw&, SkCanvas::VertexMode, int vertexCount, const SkPoint verts[],
-                      const SkPoint texs[], const SkColor colors[], SkXfermode* xmode,
+                      const SkPoint texs[], const SkColor colors[], SK_XFERMODE_PARAM,
                       const uint16_t indices[], int indexCount, const SkPaint&) override;
     void drawAtlas(const SkDraw&, const SkImage* atlas, const SkRSXform[], const SkRect[],
-                   const SkColor[], int count, SkXfermode::Mode, const SkPaint&) override;
+                   const SkColor[], int count, SK_XFERMODE_MODE_PARAM, const SkPaint&) override;
     void drawDevice(const SkDraw&, SkBaseDevice*, int x, int y, const SkPaint&) override;
 
     void drawImage(const SkDraw&, const SkImage*, SkScalar x, SkScalar y, const SkPaint&) override;
index 95bd30c..270be46 100644 (file)
@@ -566,11 +566,11 @@ GrPixelConfig GrRenderableConfigForColorSpace(const SkColorSpace* colorSpace) {
 
 ////////////////////////////////////////////////////////////////////////////////////////////////
 
-static inline bool blend_requires_shader(const SkXfermode::Mode mode, bool primitiveIsSrc) {
+static inline bool blend_requires_shader(const SkBlendMode mode, bool primitiveIsSrc) {
     if (primitiveIsSrc) {
-        return SkXfermode::kSrc_Mode != mode;
+        return SkBlendMode::kSrc != mode;
     } else {
-        return SkXfermode::kDst_Mode != mode;
+        return SkBlendMode::kDst != mode;
     }
 }
 
@@ -579,7 +579,7 @@ static inline bool skpaint_to_grpaint_impl(GrContext* context,
                                            const SkPaint& skPaint,
                                            const SkMatrix& viewM,
                                            sk_sp<GrFragmentProcessor>* shaderProcessor,
-                                           SkXfermode::Mode* primColorMode,
+                                           SkBlendMode* primColorMode,
                                            bool primitiveIsSrc,
                                            GrPaint* grPaint) {
     grPaint->setAntiAlias(skPaint.isAntiAlias());
@@ -760,12 +760,12 @@ bool SkPaintToGrPaintNoShader(GrContext* context,
 }
 
 /** Blends the SkPaint's shader (or color if no shader) with a per-primitive color which must
-be setup as a vertex attribute using the specified SkXfermode::Mode. */
+be setup as a vertex attribute using the specified SkBlendMode. */
 bool SkPaintToGrPaintWithXfermode(GrContext* context,
                                   GrRenderTargetContext* rtc,
                                   const SkPaint& skPaint,
                                   const SkMatrix& viewM,
-                                  SkXfermode::Mode primColorMode,
+                                  SkBlendMode primColorMode,
                                   bool primitiveIsSrc,
                                   GrPaint* grPaint) {
     return skpaint_to_grpaint_impl(context, rtc, skPaint, viewM, nullptr, &primColorMode,
index 1a976f1..3aa8a0c 100644 (file)
@@ -75,7 +75,7 @@ bool SkPaintToGrPaintWithXfermode(GrContext* context,
                                   GrRenderTargetContext* rtc,
                                   const SkPaint& skPaint,
                                   const SkMatrix& viewM,
-                                  SkXfermode::Mode primColorMode,
+                                  SkBlendMode primColorMode,
                                   bool primitiveIsSrc,
                                   GrPaint* grPaint);
 
@@ -85,7 +85,7 @@ bool SkPaintToGrPaintWithXfermode(GrContext* context,
     applied to the primitive color after interpolation. */
 inline bool SkPaintToGrPaintWithPrimitiveColor(GrContext* context, GrRenderTargetContext* rtc,
                                                const SkPaint& skPaint, GrPaint* grPaint) {
-    return SkPaintToGrPaintWithXfermode(context, rtc, skPaint, SkMatrix::I(), SkXfermode::kDst_Mode,
+    return SkPaintToGrPaintWithXfermode(context, rtc, skPaint, SkMatrix::I(), SkBlendMode::kDst,
                                         false, grPaint);
 }
 
index 1b94a6b..3895f57 100644 (file)
 #include "glsl/GrGLSLUniformHandler.h"
 #include "glsl/GrGLSLXferProcessor.h"
 
-bool GrCustomXfermode::IsSupportedMode(SkXfermode::Mode mode) {
-    return mode > SkXfermode::kLastCoeffMode && mode <= SkXfermode::kLastMode;
+bool GrCustomXfermode::IsSupportedMode(SkBlendMode mode) {
+    return (int)mode  > (int)SkBlendMode::kLastCoeffMode &&
+           (int)mode <= (int)SkBlendMode::kLastMode;
 }
 
 ///////////////////////////////////////////////////////////////////////////////
 // Static helpers
 ///////////////////////////////////////////////////////////////////////////////
 
-static GrBlendEquation hw_blend_equation(SkXfermode::Mode mode) {
-    enum { kOffset = kOverlay_GrBlendEquation - SkXfermode::kOverlay_Mode };
-    return static_cast<GrBlendEquation>(mode + kOffset);
-
-    GR_STATIC_ASSERT(kOverlay_GrBlendEquation == SkXfermode::kOverlay_Mode + kOffset);
-    GR_STATIC_ASSERT(kDarken_GrBlendEquation == SkXfermode::kDarken_Mode + kOffset);
-    GR_STATIC_ASSERT(kLighten_GrBlendEquation == SkXfermode::kLighten_Mode + kOffset);
-    GR_STATIC_ASSERT(kColorDodge_GrBlendEquation == SkXfermode::kColorDodge_Mode + kOffset);
-    GR_STATIC_ASSERT(kColorBurn_GrBlendEquation == SkXfermode::kColorBurn_Mode + kOffset);
-    GR_STATIC_ASSERT(kHardLight_GrBlendEquation == SkXfermode::kHardLight_Mode + kOffset);
-    GR_STATIC_ASSERT(kSoftLight_GrBlendEquation == SkXfermode::kSoftLight_Mode + kOffset);
-    GR_STATIC_ASSERT(kDifference_GrBlendEquation == SkXfermode::kDifference_Mode + kOffset);
-    GR_STATIC_ASSERT(kExclusion_GrBlendEquation == SkXfermode::kExclusion_Mode + kOffset);
-    GR_STATIC_ASSERT(kMultiply_GrBlendEquation == SkXfermode::kMultiply_Mode + kOffset);
-    GR_STATIC_ASSERT(kHSLHue_GrBlendEquation == SkXfermode::kHue_Mode + kOffset);
-    GR_STATIC_ASSERT(kHSLSaturation_GrBlendEquation == SkXfermode::kSaturation_Mode + kOffset);
-    GR_STATIC_ASSERT(kHSLColor_GrBlendEquation == SkXfermode::kColor_Mode + kOffset);
-    GR_STATIC_ASSERT(kHSLLuminosity_GrBlendEquation == SkXfermode::kLuminosity_Mode + kOffset);
-    GR_STATIC_ASSERT(kGrBlendEquationCnt == SkXfermode::kLastMode + 1 + kOffset);
+static GrBlendEquation hw_blend_equation(SkBlendMode mode) {
+    enum { kOffset = kOverlay_GrBlendEquation - (int)SkBlendMode::kOverlay };
+    return static_cast<GrBlendEquation>((int)mode + kOffset);
+
+    GR_STATIC_ASSERT(kOverlay_GrBlendEquation == (int)SkBlendMode::kOverlay + kOffset);
+    GR_STATIC_ASSERT(kDarken_GrBlendEquation == (int)SkBlendMode::kDarken + kOffset);
+    GR_STATIC_ASSERT(kLighten_GrBlendEquation == (int)SkBlendMode::kLighten + kOffset);
+    GR_STATIC_ASSERT(kColorDodge_GrBlendEquation == (int)SkBlendMode::kColorDodge + kOffset);
+    GR_STATIC_ASSERT(kColorBurn_GrBlendEquation == (int)SkBlendMode::kColorBurn + kOffset);
+    GR_STATIC_ASSERT(kHardLight_GrBlendEquation == (int)SkBlendMode::kHardLight + kOffset);
+    GR_STATIC_ASSERT(kSoftLight_GrBlendEquation == (int)SkBlendMode::kSoftLight + kOffset);
+    GR_STATIC_ASSERT(kDifference_GrBlendEquation == (int)SkBlendMode::kDifference + kOffset);
+    GR_STATIC_ASSERT(kExclusion_GrBlendEquation == (int)SkBlendMode::kExclusion + kOffset);
+    GR_STATIC_ASSERT(kMultiply_GrBlendEquation == (int)SkBlendMode::kMultiply + kOffset);
+    GR_STATIC_ASSERT(kHSLHue_GrBlendEquation == (int)SkBlendMode::kHue + kOffset);
+    GR_STATIC_ASSERT(kHSLSaturation_GrBlendEquation == (int)SkBlendMode::kSaturation + kOffset);
+    GR_STATIC_ASSERT(kHSLColor_GrBlendEquation == (int)SkBlendMode::kColor + kOffset);
+    GR_STATIC_ASSERT(kHSLLuminosity_GrBlendEquation == (int)SkBlendMode::kLuminosity + kOffset);
+    GR_STATIC_ASSERT(kGrBlendEquationCnt == (int)SkBlendMode::kLastMode + 1 + kOffset);
 }
 
 static bool can_use_hw_blend_equation(GrBlendEquation equation,
@@ -77,13 +78,13 @@ static bool can_use_hw_blend_equation(GrBlendEquation equation,
 
 class CustomXP : public GrXferProcessor {
 public:
-    CustomXP(SkXfermode::Mode mode, GrBlendEquation hwBlendEquation)
+    CustomXP(SkBlendMode mode, GrBlendEquation hwBlendEquation)
         : fMode(mode),
           fHWBlendEquation(hwBlendEquation) {
         this->initClassID<CustomXP>();
     }
 
-    CustomXP(const DstTexture* dstTexture, bool hasMixedSamples, SkXfermode::Mode mode)
+    CustomXP(const DstTexture* dstTexture, bool hasMixedSamples, SkBlendMode mode)
         : INHERITED(dstTexture, true, hasMixedSamples),
           fMode(mode),
           fHWBlendEquation(static_cast<GrBlendEquation>(-1)) {
@@ -94,7 +95,7 @@ public:
 
     GrGLSLXferProcessor* createGLSLInstance() const override;
 
-    SkXfermode::Mode mode() const { return fMode; }
+    SkBlendMode mode() const { return fMode; }
     bool hasHWBlendEquation() const { return -1 != static_cast<int>(fHWBlendEquation); }
 
     GrBlendEquation hwBlendEquation() const {
@@ -116,7 +117,7 @@ private:
 
     bool onIsEqual(const GrXferProcessor& xpBase) const override;
 
-    const SkXfermode::Mode fMode;
+    const SkBlendMode      fMode;
     const GrBlendEquation  fHWBlendEquation;
 
     typedef GrXferProcessor INHERITED;
@@ -138,7 +139,7 @@ public:
             GR_STATIC_ASSERT(GrGLSLCaps::kLast_AdvBlendEqInteraction < 4);
         }
         if (!xp.hasHWBlendEquation() || caps.mustEnableSpecificAdvBlendEqs()) {
-            key |= xp.mode() << 3;
+            key |= (int)xp.mode() << 3;
         }
         b->add32(key);
     }
@@ -326,7 +327,7 @@ void CustomXP::onGetBlendInfo(BlendInfo* blendInfo) const {
 ///////////////////////////////////////////////////////////////////////////////
 class CustomXPFactory : public GrXPFactory {
 public:
-    CustomXPFactory(SkXfermode::Mode mode);
+    CustomXPFactory(SkBlendMode mode);
 
     void getInvariantBlendedColor(const GrProcOptInfo& colorPOI,
                                   GrXPFactory::InvariantBlendedColor*) const override;
@@ -346,13 +347,13 @@ private:
 
     GR_DECLARE_XP_FACTORY_TEST;
 
-    SkXfermode::Mode fMode;
-    GrBlendEquation  fHWBlendEquation;
+    SkBlendMode     fMode;
+    GrBlendEquation fHWBlendEquation;
 
     typedef GrXPFactory INHERITED;
 };
 
-CustomXPFactory::CustomXPFactory(SkXfermode::Mode mode)
+CustomXPFactory::CustomXPFactory(SkBlendMode mode)
     : fMode(mode),
       fHWBlendEquation(hw_blend_equation(mode)) {
     SkASSERT(GrCustomXfermode::IsSupportedMode(fMode));
@@ -386,12 +387,12 @@ sk_sp<GrXPFactory> CustomXPFactory::TestCreate(GrProcessorTestData* d) {
     int mode = d->fRandom->nextRangeU(SkXfermode::kLastCoeffMode + 1,
                                       SkXfermode::kLastSeparableMode);
 
-    return sk_sp<GrXPFactory>(new CustomXPFactory(static_cast<SkXfermode::Mode>(mode)));
+    return sk_sp<GrXPFactory>(new CustomXPFactory(static_cast<SkBlendMode>(mode)));
 }
 
 ///////////////////////////////////////////////////////////////////////////////
 
-sk_sp<GrXPFactory> GrCustomXfermode::MakeXPFactory(SkXfermode::Mode mode) {
+sk_sp<GrXPFactory> GrCustomXfermode::MakeXPFactory(SkBlendMode mode) {
     if (!GrCustomXfermode::IsSupportedMode(mode)) {
         return nullptr;
     } else {
index f51e94b..d511fae 100644 (file)
@@ -323,20 +323,20 @@ static const BlendFormula gLCDBlendTable[SkXfermode::kLastCoeffMode + 1] = {
 static BlendFormula get_blend_formula(const GrProcOptInfo& colorPOI,
                                       const GrProcOptInfo& coveragePOI,
                                       bool hasMixedSamples,
-                                      SkXfermode::Mode xfermode) {
-    SkASSERT(xfermode >= 0 && xfermode <= SkXfermode::kLastCoeffMode);
+                                      SkBlendMode xfermode) {
+    SkASSERT((unsigned)xfermode <= (unsigned)SkBlendMode::kLastCoeffMode);
     SkASSERT(!coveragePOI.isFourChannelOutput());
 
     bool conflatesCoverage = !coveragePOI.isSolidWhite() || hasMixedSamples;
-    return gBlendTable[colorPOI.isOpaque()][conflatesCoverage][xfermode];
+    return gBlendTable[colorPOI.isOpaque()][conflatesCoverage][(int)xfermode];
 }
 
 static BlendFormula get_lcd_blend_formula(const GrProcOptInfo& coveragePOI,
-                                          SkXfermode::Mode xfermode) {
-    SkASSERT(xfermode >= 0 && xfermode <= SkXfermode::kLastCoeffMode);
+                                          SkBlendMode xfermode) {
+    SkASSERT((unsigned)xfermode <= (unsigned)SkBlendMode::kLastCoeffMode);
     SkASSERT(coveragePOI.isFourChannelOutput());
 
-    return gLCDBlendTable[xfermode];
+    return gLCDBlendTable[(int)xfermode];
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -506,7 +506,7 @@ class ShaderPDXferProcessor : public GrXferProcessor {
 public:
     ShaderPDXferProcessor(const DstTexture* dstTexture,
                           bool hasMixedSamples,
-                          SkXfermode::Mode xfermode)
+                          SkBlendMode xfermode)
         : INHERITED(dstTexture, true, hasMixedSamples)
         , fXfermode(xfermode) {
         this->initClassID<ShaderPDXferProcessor>();
@@ -516,7 +516,7 @@ public:
 
     GrGLSLXferProcessor* createGLSLInstance() const override;
 
-    SkXfermode::Mode getXfermode() const { return fXfermode; }
+    SkBlendMode getXfermode() const { return fXfermode; }
 
 private:
     GrXferProcessor::OptFlags onGetOptimizations(const GrPipelineOptimizations&, bool, GrColor*,
@@ -531,7 +531,7 @@ private:
         return fXfermode == xp.fXfermode;
     }
 
-    const SkXfermode::Mode fXfermode;
+    const SkBlendMode fXfermode;
 
     typedef GrXferProcessor INHERITED;
 };
@@ -542,7 +542,7 @@ class GLShaderPDXferProcessor : public GrGLSLXferProcessor {
 public:
     static void GenKey(const GrProcessor& processor, GrProcessorKeyBuilder* b) {
         const ShaderPDXferProcessor& xp = processor.cast<ShaderPDXferProcessor>();
-        b->add32(xp.getXfermode());
+        b->add32((int)xp.getXfermode());
     }
 
 private:
@@ -583,7 +583,7 @@ GrGLSLXferProcessor* ShaderPDXferProcessor::createGLSLInstance() const {
 
 class PDLCDXferProcessor : public GrXferProcessor {
 public:
-    static GrXferProcessor* Create(SkXfermode::Mode xfermode, const GrProcOptInfo& colorPOI);
+    static GrXferProcessor* Create(SkBlendMode xfermode, const GrProcOptInfo& colorPOI);
 
     ~PDLCDXferProcessor() override;
 
@@ -654,9 +654,9 @@ PDLCDXferProcessor::PDLCDXferProcessor(GrColor blendConstant, uint8_t alpha)
     this->initClassID<PDLCDXferProcessor>();
 }
 
-GrXferProcessor* PDLCDXferProcessor::Create(SkXfermode::Mode xfermode,
+GrXferProcessor* PDLCDXferProcessor::Create(SkBlendMode xfermode,
                                             const GrProcOptInfo& colorPOI) {
-    if (SkXfermode::kSrcOver_Mode != xfermode) {
+    if (SkBlendMode::kSrcOver != xfermode) {
         return nullptr;
     }
 
@@ -698,40 +698,40 @@ PDLCDXferProcessor::onGetOptimizations(const GrPipelineOptimizations& optimizati
 
 ///////////////////////////////////////////////////////////////////////////////
 
-GrPorterDuffXPFactory::GrPorterDuffXPFactory(SkXfermode::Mode xfermode)
+GrPorterDuffXPFactory::GrPorterDuffXPFactory(SkBlendMode xfermode)
     : fXfermode(xfermode) {
-    SkASSERT(fXfermode <= SkXfermode::kLastCoeffMode);
+    SkASSERT((unsigned)fXfermode <= (unsigned)SkBlendMode::kLastCoeffMode);
     this->initClassID<GrPorterDuffXPFactory>();
 }
 
-sk_sp<GrXPFactory> GrPorterDuffXPFactory::Make(SkXfermode::Mode xfermode) {
-    static GrPorterDuffXPFactory gClearPDXPF(SkXfermode::kClear_Mode);
-    static GrPorterDuffXPFactory gSrcPDXPF(SkXfermode::kSrc_Mode);
-    static GrPorterDuffXPFactory gDstPDXPF(SkXfermode::kDst_Mode);
-    static GrPorterDuffXPFactory gSrcOverPDXPF(SkXfermode::kSrcOver_Mode);
-    static GrPorterDuffXPFactory gDstOverPDXPF(SkXfermode::kDstOver_Mode);
-    static GrPorterDuffXPFactory gSrcInPDXPF(SkXfermode::kSrcIn_Mode);
-    static GrPorterDuffXPFactory gDstInPDXPF(SkXfermode::kDstIn_Mode);
-    static GrPorterDuffXPFactory gSrcOutPDXPF(SkXfermode::kSrcOut_Mode);
-    static GrPorterDuffXPFactory gDstOutPDXPF(SkXfermode::kDstOut_Mode);
-    static GrPorterDuffXPFactory gSrcATopPDXPF(SkXfermode::kSrcATop_Mode);
-    static GrPorterDuffXPFactory gDstATopPDXPF(SkXfermode::kDstATop_Mode);
-    static GrPorterDuffXPFactory gXorPDXPF(SkXfermode::kXor_Mode);
-    static GrPorterDuffXPFactory gPlusPDXPF(SkXfermode::kPlus_Mode);
-    static GrPorterDuffXPFactory gModulatePDXPF(SkXfermode::kModulate_Mode);
-    static GrPorterDuffXPFactory gScreenPDXPF(SkXfermode::kScreen_Mode);
+sk_sp<GrXPFactory> GrPorterDuffXPFactory::Make(SkBlendMode xfermode) {
+    static GrPorterDuffXPFactory gClearPDXPF(SkBlendMode::kClear);
+    static GrPorterDuffXPFactory gSrcPDXPF(SkBlendMode::kSrc);
+    static GrPorterDuffXPFactory gDstPDXPF(SkBlendMode::kDst);
+    static GrPorterDuffXPFactory gSrcOverPDXPF(SkBlendMode::kSrcOver);
+    static GrPorterDuffXPFactory gDstOverPDXPF(SkBlendMode::kDstOver);
+    static GrPorterDuffXPFactory gSrcInPDXPF(SkBlendMode::kSrcIn);
+    static GrPorterDuffXPFactory gDstInPDXPF(SkBlendMode::kDstIn);
+    static GrPorterDuffXPFactory gSrcOutPDXPF(SkBlendMode::kSrcOut);
+    static GrPorterDuffXPFactory gDstOutPDXPF(SkBlendMode::kDstOut);
+    static GrPorterDuffXPFactory gSrcATopPDXPF(SkBlendMode::kSrcATop);
+    static GrPorterDuffXPFactory gDstATopPDXPF(SkBlendMode::kDstATop);
+    static GrPorterDuffXPFactory gXorPDXPF(SkBlendMode::kXor);
+    static GrPorterDuffXPFactory gPlusPDXPF(SkBlendMode::kPlus);
+    static GrPorterDuffXPFactory gModulatePDXPF(SkBlendMode::kModulate);
+    static GrPorterDuffXPFactory gScreenPDXPF(SkBlendMode::kScreen);
 
     static GrPorterDuffXPFactory* gFactories[] = {
         &gClearPDXPF, &gSrcPDXPF, &gDstPDXPF, &gSrcOverPDXPF, &gDstOverPDXPF, &gSrcInPDXPF,
         &gDstInPDXPF, &gSrcOutPDXPF, &gDstOutPDXPF, &gSrcATopPDXPF, &gDstATopPDXPF, &gXorPDXPF,
         &gPlusPDXPF, &gModulatePDXPF, &gScreenPDXPF
     };
-    GR_STATIC_ASSERT(SK_ARRAY_COUNT(gFactories) == SkXfermode::kLastCoeffMode + 1);
+    GR_STATIC_ASSERT(SK_ARRAY_COUNT(gFactories) == (int)SkBlendMode::kLastCoeffMode + 1);
 
-    if (xfermode < 0 || xfermode > SkXfermode::kLastCoeffMode) {
+    if ((int)xfermode < 0 || (int)xfermode > (int)SkBlendMode::kLastCoeffMode) {
         return nullptr;
     }
-    return sk_sp<GrXPFactory>(SkRef(gFactories[xfermode]));
+    return sk_sp<GrXPFactory>(SkRef(gFactories[(int)xfermode]));
 }
 
 GrXferProcessor*
@@ -744,7 +744,7 @@ GrPorterDuffXPFactory::onCreateXferProcessor(const GrCaps& caps,
     }
     BlendFormula blendFormula;
     if (optimizations.fCoveragePOI.isFourChannelOutput()) {
-        if (SkXfermode::kSrcOver_Mode == fXfermode &&
+        if (SkBlendMode::kSrcOver == fXfermode &&
             kRGBA_GrColorComponentFlags == optimizations.fColorPOI.validFlags() &&
             !caps.shaderCaps()->dualSourceBlendingSupport() &&
             !caps.shaderCaps()->dstReadInShaderSupport()) {
@@ -770,7 +770,7 @@ GrPorterDuffXPFactory::onCreateXferProcessor(const GrCaps& caps,
 void GrPorterDuffXPFactory::getInvariantBlendedColor(const GrProcOptInfo& colorPOI,
                                                      InvariantBlendedColor* blendedColor) const {
     // Find the blended color info based on the formula that does not have coverage.
-    BlendFormula colorFormula = gBlendTable[colorPOI.isOpaque()][0][fXfermode];
+    BlendFormula colorFormula = gBlendTable[colorPOI.isOpaque()][0][(int)fXfermode];
     if (colorFormula.usesDstColor()) {
         blendedColor->fWillBlendWithDst = true;
         blendedColor->fKnownColorFlags = kNone_GrColorComponentFlags;
@@ -808,7 +808,7 @@ bool GrPorterDuffXPFactory::onWillReadDstColor(const GrCaps& caps,
     // blend. The one exception is when we are using srcover mode and we know the input color into
     // the XP.
     if (optimizations.fCoveragePOI.isFourChannelOutput()) {
-        if (SkXfermode::kSrcOver_Mode == fXfermode &&
+        if (SkBlendMode::kSrcOver == fXfermode &&
             kRGBA_GrColorComponentFlags == optimizations.fColorPOI.validFlags() &&
             !caps.shaderCaps()->dstReadInShaderSupport()) {
             return false;
@@ -827,7 +827,7 @@ bool GrPorterDuffXPFactory::onWillReadDstColor(const GrCaps& caps,
 GR_DEFINE_XP_FACTORY_TEST(GrPorterDuffXPFactory);
 
 sk_sp<GrXPFactory> GrPorterDuffXPFactory::TestCreate(GrProcessorTestData* d) {
-    SkXfermode::Mode mode = SkXfermode::Mode(d->fRandom->nextULessThan(SkXfermode::kLastCoeffMode));
+    SkBlendMode mode = SkBlendMode(d->fRandom->nextULessThan((int)SkBlendMode::kLastCoeffMode));
     return GrPorterDuffXPFactory::Make(mode);
 }
 
@@ -860,7 +860,7 @@ GrXferProcessor* GrPorterDuffXPFactory::CreateSrcOverXferProcessor(
         bool hasMixedSamples,
         const GrXferProcessor::DstTexture* dstTexture) {
     if (optimizations.fOverrides.fUsePLSDstRead) {
-        return new ShaderPDXferProcessor(dstTexture, hasMixedSamples, SkXfermode::kSrcOver_Mode);
+        return new ShaderPDXferProcessor(dstTexture, hasMixedSamples, SkBlendMode::kSrcOver);
     }
 
     // We want to not make an xfer processor if possible. Thus for the simple case where we are not
@@ -882,13 +882,13 @@ GrXferProcessor* GrPorterDuffXPFactory::CreateSrcOverXferProcessor(
         // back to this trick for rendering SrcOver LCD text instead of doing a
         // dst copy.
         SkASSERT(!dstTexture || !dstTexture->texture());
-        return PDLCDXferProcessor::Create(SkXfermode::kSrcOver_Mode, optimizations.fColorPOI);
+        return PDLCDXferProcessor::Create(SkBlendMode::kSrcOver, optimizations.fColorPOI);
     }
 
     BlendFormula blendFormula;
-    blendFormula = get_lcd_blend_formula(optimizations.fCoveragePOI, SkXfermode::kSrcOver_Mode);
+    blendFormula = get_lcd_blend_formula(optimizations.fCoveragePOI, SkBlendMode::kSrcOver);
     if (blendFormula.hasSecondaryOutput() && !caps.shaderCaps()->dualSourceBlendingSupport()) {
-        return new ShaderPDXferProcessor(dstTexture, hasMixedSamples, SkXfermode::kSrcOver_Mode);
+        return new ShaderPDXferProcessor(dstTexture, hasMixedSamples, SkBlendMode::kSrcOver);
     }
 
     SkASSERT(!dstTexture || !dstTexture->texture());
@@ -911,7 +911,7 @@ bool GrPorterDuffXPFactory::SrcOverWillNeedDstTexture(const GrCaps& caps,
             return false;
         }
         return get_lcd_blend_formula(optimizations.fCoveragePOI,
-                                     SkXfermode::kSrcOver_Mode).hasSecondaryOutput();
+                                     SkBlendMode::kSrcOver).hasSecondaryOutput();
     }
 
     // We fallback on the shader XP when the blend formula would use dual source blending but we
@@ -919,5 +919,5 @@ bool GrPorterDuffXPFactory::SrcOverWillNeedDstTexture(const GrCaps& caps,
     static const bool kHasMixedSamples = false;
     SkASSERT(!caps.usesMixedSamples()); // We never use mixed samples without dual source blending.
     return get_blend_formula(optimizations.fColorPOI, optimizations.fCoveragePOI,
-                             kHasMixedSamples, SkXfermode::kSrcOver_Mode).hasSecondaryOutput();
+                             kHasMixedSamples, SkBlendMode::kSrcOver).hasSecondaryOutput();
 }
index 935747b..0e8e16c 100644 (file)
@@ -18,7 +18,7 @@
 class ComposeTwoFragmentProcessor : public GrFragmentProcessor {
 public:
     ComposeTwoFragmentProcessor(sk_sp<GrFragmentProcessor> src, sk_sp<GrFragmentProcessor> dst,
-                                SkXfermode::Mode mode)
+                                SkBlendMode mode)
         : fMode(mode) {
         this->initClassID<ComposeTwoFragmentProcessor>();
         SkDEBUGCODE(int shaderAChildIndex = )this->registerChildProcessor(std::move(src));
@@ -30,10 +30,10 @@ public:
     const char* name() const override { return "ComposeTwo"; }
 
     void onGetGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override {
-        b->add32(fMode);
+        b->add32((int)fMode);
     }
 
-    SkXfermode::Mode getMode() const { return fMode; }
+    SkBlendMode getMode() const { return fMode; }
 
 protected:
     bool onIsEqual(const GrFragmentProcessor& other) const override {
@@ -48,7 +48,7 @@ protected:
 private:
     GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
 
-    SkXfermode::Mode fMode;
+    SkBlendMode fMode;
 
     GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
 
@@ -74,8 +74,8 @@ sk_sp<GrFragmentProcessor> ComposeTwoFragmentProcessor::TestCreate(GrProcessorTe
     sk_sp<GrFragmentProcessor> fpA(GrProcessorUnitTest::MakeChildFP(d));
     sk_sp<GrFragmentProcessor> fpB(GrProcessorUnitTest::MakeChildFP(d));
 
-    SkXfermode::Mode mode = static_cast<SkXfermode::Mode>(
-        d->fRandom->nextRangeU(0, SkXfermode::kLastMode));
+    SkBlendMode mode = static_cast<SkBlendMode>(
+        d->fRandom->nextRangeU(0, (int)SkBlendMode::kLastMode));
     return sk_sp<GrFragmentProcessor>(
         new ComposeTwoFragmentProcessor(std::move(fpA), std::move(fpB), mode));
 }
@@ -105,7 +105,7 @@ void GLComposeTwoFragmentProcessor::emitCode(EmitArgs& args) {
     this->emitChild(1, inputColor, &dstColor, args);
 
     // emit blend code
-    SkXfermode::Mode mode = cs.getMode();
+    SkBlendMode mode = cs.getMode();
     fragBuilder->codeAppendf("// Compose Xfer Mode: %s\n", SkXfermode::ModeName(mode));
     GrGLSLBlend::AppendMode(fragBuilder,
                             srcColor.c_str(),
@@ -120,14 +120,14 @@ void GLComposeTwoFragmentProcessor::emitCode(EmitArgs& args) {
 }
 
 sk_sp<GrFragmentProcessor> GrXfermodeFragmentProcessor::MakeFromTwoProcessors(
-         sk_sp<GrFragmentProcessor> src, sk_sp<GrFragmentProcessor> dst, SkXfermode::Mode mode) {
+         sk_sp<GrFragmentProcessor> src, sk_sp<GrFragmentProcessor> dst, SkBlendMode mode) {
     switch (mode) {
-        case SkXfermode::kClear_Mode:
+        case SkBlendMode::kClear:
             return GrConstColorProcessor::Make(GrColor4f::TransparentBlack(),
                                                GrConstColorProcessor::kIgnore_InputMode);
-        case SkXfermode::kSrc_Mode:
+        case SkBlendMode::kSrc:
             return src;
-        case SkXfermode::kDst_Mode:
+        case SkBlendMode::kDst:
             return dst;
         default:
             return sk_sp<GrFragmentProcessor>(
@@ -144,7 +144,7 @@ public:
         kSrc_Child,
     };
 
-    ComposeOneFragmentProcessor(sk_sp<GrFragmentProcessor> dst, SkXfermode::Mode mode, Child child)
+    ComposeOneFragmentProcessor(sk_sp<GrFragmentProcessor> dst, SkBlendMode mode, Child child)
         : fMode(mode)
         , fChild(child) {
         this->initClassID<ComposeOneFragmentProcessor>();
@@ -164,11 +164,11 @@ public:
     }
 
     void onGetGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override {
-        GR_STATIC_ASSERT((SkXfermode::kLastMode & SK_MaxU16) == SkXfermode::kLastMode);
-        b->add32(fMode | (fChild << 16));
+        GR_STATIC_ASSERT(((int)SkBlendMode::kLastMode & SK_MaxU16) == (int)SkBlendMode::kLastMode);
+        b->add32((int)fMode | (fChild << 16));
     }
 
-    SkXfermode::Mode mode() const { return fMode; }
+    SkBlendMode mode() const { return fMode; }
 
     Child child() const { return fChild; }
 
@@ -217,8 +217,8 @@ protected:
 private:
     GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
 
-    SkXfermode::Mode    fMode;
-    Child               fChild;
+    SkBlendMode fMode;
+    Child       fChild;
 
     GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
 
@@ -231,7 +231,7 @@ class GLComposeOneFragmentProcessor : public GrGLSLFragmentProcessor {
 public:
     void emitCode(EmitArgs& args) override {
         GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
-        SkXfermode::Mode mode = args.fFp.cast<ComposeOneFragmentProcessor>().mode();
+        SkBlendMode mode = args.fFp.cast<ComposeOneFragmentProcessor>().mode();
         ComposeOneFragmentProcessor::Child child =
             args.fFp.cast<ComposeOneFragmentProcessor>().child();
         SkString childColor("child");
@@ -267,8 +267,8 @@ sk_sp<GrFragmentProcessor> ComposeOneFragmentProcessor::TestCreate(GrProcessorTe
     // For now, we'll prevent either children from being a shader with children to prevent the
     // possibility of an arbitrarily large tree of procs.
     sk_sp<GrFragmentProcessor> dst(GrProcessorUnitTest::MakeChildFP(d));
-    SkXfermode::Mode mode = static_cast<SkXfermode::Mode>(
-        d->fRandom->nextRangeU(0, SkXfermode::kLastMode));
+    SkBlendMode mode = static_cast<SkBlendMode>(
+        d->fRandom->nextRangeU(0, (int)SkBlendMode::kLastMode));
     ComposeOneFragmentProcessor::Child child = d->fRandom->nextBool() ?
         ComposeOneFragmentProcessor::kDst_Child :
         ComposeOneFragmentProcessor::kSrc_Child;
@@ -282,12 +282,12 @@ GrGLSLFragmentProcessor* ComposeOneFragmentProcessor::onCreateGLSLInstance() con
 //////////////////////////////////////////////////////////////////////////////
 
 sk_sp<GrFragmentProcessor> GrXfermodeFragmentProcessor::MakeFromDstProcessor(
-    sk_sp<GrFragmentProcessor> dst, SkXfermode::Mode mode) {
+    sk_sp<GrFragmentProcessor> dst, SkBlendMode mode) {
     switch (mode) {
-        case SkXfermode::kClear_Mode:
+        case SkBlendMode::kClear:
             return GrConstColorProcessor::Make(GrColor4f::TransparentBlack(),
                                                  GrConstColorProcessor::kIgnore_InputMode);
-        case SkXfermode::kSrc_Mode:
+        case SkBlendMode::kSrc:
             return nullptr;
         default:
             return sk_sp<GrFragmentProcessor>(
@@ -297,12 +297,12 @@ sk_sp<GrFragmentProcessor> GrXfermodeFragmentProcessor::MakeFromDstProcessor(
 }
 
 sk_sp<GrFragmentProcessor> GrXfermodeFragmentProcessor::MakeFromSrcProcessor(
-    sk_sp<GrFragmentProcessor> src, SkXfermode::Mode mode) {
+    sk_sp<GrFragmentProcessor> src, SkBlendMode mode) {
     switch (mode) {
-        case SkXfermode::kClear_Mode:
+        case SkBlendMode::kClear:
             return GrConstColorProcessor::Make(GrColor4f::TransparentBlack(),
                                                  GrConstColorProcessor::kIgnore_InputMode);
-        case SkXfermode::kDst_Mode:
+        case SkBlendMode::kDst:
             return nullptr;
         default:
             return sk_sp<GrFragmentProcessor>(
index d2c3640..73a145b 100644 (file)
@@ -237,7 +237,7 @@ static void add_sat_function(GrGLSLFragmentBuilder* fsBuilder, SkString* setSatF
 
 static void emit_advanced_xfermode_code(GrGLSLFragmentBuilder* fsBuilder, const char* srcColor,
                                         const char* dstColor, const char* outputColor,
-                                        SkXfermode::Mode mode) {
+                                        SkBlendMode mode) {
     SkASSERT(srcColor);
     SkASSERT(dstColor);
     SkASSERT(outputColor);
@@ -246,38 +246,38 @@ static void emit_advanced_xfermode_code(GrGLSLFragmentBuilder* fsBuilder, const
                            outputColor, srcColor, srcColor, dstColor);
 
     switch (mode) {
-        case SkXfermode::kOverlay_Mode:
+        case SkBlendMode::kOverlay:
             // Overlay is Hard-Light with the src and dst reversed
             hard_light(fsBuilder, outputColor, dstColor, srcColor);
             break;
-        case SkXfermode::kDarken_Mode:
+        case SkBlendMode::kDarken:
             fsBuilder->codeAppendf("%s.rgb = min((1.0 - %s.a) * %s.rgb + %s.rgb, "
                                    "(1.0 - %s.a) * %s.rgb + %s.rgb);",
                                    outputColor,
                                    srcColor, dstColor, srcColor,
                                    dstColor, srcColor, dstColor);
             break;
-        case SkXfermode::kLighten_Mode:
+        case SkBlendMode::kLighten:
             fsBuilder->codeAppendf("%s.rgb = max((1.0 - %s.a) * %s.rgb + %s.rgb, "
                                    "(1.0 - %s.a) * %s.rgb + %s.rgb);",
                                    outputColor,
                                    srcColor, dstColor, srcColor,
                                    dstColor, srcColor, dstColor);
             break;
-        case SkXfermode::kColorDodge_Mode:
+        case SkBlendMode::kColorDodge:
             color_dodge_component(fsBuilder, outputColor, srcColor, dstColor, 'r');
             color_dodge_component(fsBuilder, outputColor, srcColor, dstColor, 'g');
             color_dodge_component(fsBuilder, outputColor, srcColor, dstColor, 'b');
             break;
-        case SkXfermode::kColorBurn_Mode:
+        case SkBlendMode::kColorBurn:
             color_burn_component(fsBuilder, outputColor, srcColor, dstColor, 'r');
             color_burn_component(fsBuilder, outputColor, srcColor, dstColor, 'g');
             color_burn_component(fsBuilder, outputColor, srcColor, dstColor, 'b');
             break;
-        case SkXfermode::kHardLight_Mode:
+        case SkBlendMode::kHardLight:
             hard_light(fsBuilder, outputColor, srcColor, dstColor);
             break;
-        case SkXfermode::kSoftLight_Mode:
+        case SkBlendMode::kSoftLight:
             fsBuilder->codeAppendf("if (0.0 == %s.a) {", dstColor);
             fsBuilder->codeAppendf("%s.rgba = %s;", outputColor, srcColor);
             fsBuilder->codeAppendf("} else {");
@@ -286,25 +286,25 @@ static void emit_advanced_xfermode_code(GrGLSLFragmentBuilder* fsBuilder, const
             soft_light_component_pos_dst_alpha(fsBuilder, outputColor, srcColor, dstColor, 'b');
             fsBuilder->codeAppendf("}");
             break;
-        case SkXfermode::kDifference_Mode:
+        case SkBlendMode::kDifference:
             fsBuilder->codeAppendf("%s.rgb = %s.rgb + %s.rgb -"
                                    "2.0 * min(%s.rgb * %s.a, %s.rgb * %s.a);",
                                    outputColor, srcColor, dstColor, srcColor, dstColor,
                                    dstColor, srcColor);
             break;
-        case SkXfermode::kExclusion_Mode:
+        case SkBlendMode::kExclusion:
             fsBuilder->codeAppendf("%s.rgb = %s.rgb + %s.rgb - "
                                    "2.0 * %s.rgb * %s.rgb;",
                                    outputColor, dstColor, srcColor, dstColor, srcColor);
             break;
-        case SkXfermode::kMultiply_Mode:
+        case SkBlendMode::kMultiply:
             fsBuilder->codeAppendf("%s.rgb = (1.0 - %s.a) * %s.rgb + "
                                    "(1.0 - %s.a) * %s.rgb + "
                                    "%s.rgb * %s.rgb;",
                                    outputColor, srcColor, dstColor, dstColor, srcColor,
                                    srcColor, dstColor);
             break;
-        case SkXfermode::kHue_Mode: {
+        case SkBlendMode::kHue: {
             //  SetLum(SetSat(S * Da, Sat(D * Sa)), Sa*Da, D*Sa) + (1 - Sa) * D + (1 - Da) * S
             SkString setSat, setLum;
             add_sat_function(fsBuilder, &setSat);
@@ -319,7 +319,7 @@ static void emit_advanced_xfermode_code(GrGLSLFragmentBuilder* fsBuilder, const
                                    outputColor, srcColor, dstColor, dstColor, srcColor);
             break;
         }
-        case SkXfermode::kSaturation_Mode: {
+        case SkBlendMode::kSaturation: {
             // SetLum(SetSat(D * Sa, Sat(S * Da)), Sa*Da, D*Sa)) + (1 - Sa) * D + (1 - Da) * S
             SkString setSat, setLum;
             add_sat_function(fsBuilder, &setSat);
@@ -334,7 +334,7 @@ static void emit_advanced_xfermode_code(GrGLSLFragmentBuilder* fsBuilder, const
                                    outputColor, srcColor, dstColor, dstColor, srcColor);
             break;
         }
-        case SkXfermode::kColor_Mode: {
+        case SkBlendMode::kColor: {
             //  SetLum(S * Da, Sa* Da, D * Sa) + (1 - Sa) * D + (1 - Da) * S
             SkString setLum;
             add_lum_function(fsBuilder, &setLum);
@@ -346,7 +346,7 @@ static void emit_advanced_xfermode_code(GrGLSLFragmentBuilder* fsBuilder, const
                                    outputColor, srcColor, dstColor, dstColor, srcColor);
             break;
         }
-        case SkXfermode::kLuminosity_Mode: {
+        case SkBlendMode::kLuminosity: {
             //  SetLum(D * Sa, Sa* Da, S * Da) + (1 - Sa) * D + (1 - Da) * S
             SkString setLum;
             add_lum_function(fsBuilder, &setLum);
@@ -416,7 +416,7 @@ static bool append_porterduff_term(GrGLSLFragmentBuilder* fsBuilder, SkXfermode:
 
 void GrGLSLBlend::AppendMode(GrGLSLFragmentBuilder* fsBuilder, const char* srcColor,
                              const char* dstColor, const char* outColor,
-                             SkXfermode::Mode mode) {
+                             SkBlendMode mode) {
 
     SkXfermode::Coeff srcCoeff, dstCoeff;
     if (SkXfermode::ModeAsCoeff(mode, &srcCoeff, &dstCoeff)) {
index c8047f8..63d6762 100644 (file)
@@ -19,7 +19,7 @@ namespace GrGLSLBlend {
      * variables to the outColor variable.
      */
     void AppendMode(GrGLSLFragmentBuilder* fsBuilder, const char* srcColor,
-                    const char* dstColor, const char* outColor, SkXfermode::Mode mode);
+                    const char* dstColor, const char* outColor, SkBlendMode mode);
 
     void AppendRegionOp(GrGLSLFragmentBuilder* fsBuilder, const char* srcColor,
                         const char* dstColor, const char* outColor, SkRegion::Op regionOp);
index cd26c8b..d7bdc9c 100644 (file)
@@ -263,7 +263,7 @@ static sk_sp<SkImage> make_from_yuv_textures_copy(GrContext* ctx, SkYUVColorSpac
     }
 
     GrPaint paint;
-    paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode);
+    paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
     paint.addColorFragmentProcessor(
         GrYUVEffect::MakeYUVToRGB(yTex.get(), uTex.get(), vTex.get(), yuvSizes, colorSpace, nv12));
 
index 54f906e..81e5bb9 100644 (file)
@@ -217,7 +217,7 @@ template <> void mark_dst_initialized_if_safe<Clear>(void* dst, void* end) {
 template <typename Xfermode>
 class Sk4pxXfermode : public SkProcCoeffXfermode {
 public:
-    Sk4pxXfermode(const ProcCoeff& rec, SkXfermode::Mode mode)
+    Sk4pxXfermode(const ProcCoeff& rec, SkBlendMode mode)
         : INHERITED(rec, mode) {}
 
     void xfer32(SkPMColor dst[], const SkPMColor src[], int n, const SkAlpha aa[]) const override {
@@ -269,7 +269,7 @@ private:
 template <typename Xfermode>
 class Sk4fXfermode : public SkProcCoeffXfermode {
 public:
-    Sk4fXfermode(const ProcCoeff& rec, SkXfermode::Mode mode)
+    Sk4fXfermode(const ProcCoeff& rec, SkBlendMode mode)
         : INHERITED(rec, mode) {}
 
     void xfer32(SkPMColor dst[], const SkPMColor src[], int n, const SkAlpha aa[]) const override {
@@ -315,10 +315,10 @@ private:
 
 namespace SK_OPTS_NS {
 
-static SkXfermode* create_xfermode(const ProcCoeff& rec, SkXfermode::Mode mode) {
+static SkXfermode* create_xfermode(const ProcCoeff& rec, SkBlendMode mode) {
     switch (mode) {
 #define CASE(Xfermode) \
-    case SkXfermode::k##Xfermode##_Mode: return new Sk4pxXfermode<Xfermode>(rec, mode)
+    case SkBlendMode::k##Xfermode: return new Sk4pxXfermode<Xfermode>(rec, mode)
         CASE(Clear);
         CASE(Src);
         CASE(Dst);
@@ -344,7 +344,7 @@ static SkXfermode* create_xfermode(const ProcCoeff& rec, SkXfermode::Mode mode)
     #undef CASE
 
 #define CASE(Xfermode) \
-    case SkXfermode::k##Xfermode##_Mode: return new Sk4fXfermode<Xfermode>(rec, mode)
+    case SkBlendMode::k##Xfermode: return new Sk4fXfermode<Xfermode>(rec, mode)
         CASE(ColorDodge);
         CASE(ColorBurn);
         CASE(SoftLight);
index 217dd3f..8b80de2 100644 (file)
@@ -1427,7 +1427,7 @@ void SkPDFDevice::drawTextBlob(const SkDraw& draw, const SkTextBlob* blob, SkSca
 void SkPDFDevice::drawVertices(const SkDraw& d, SkCanvas::VertexMode,
                                int vertexCount, const SkPoint verts[],
                                const SkPoint texs[], const SkColor colors[],
-                               SkXfermode* xmode, const uint16_t indices[],
+                               SK_XFERMODE_PARAM xmode, const uint16_t indices[],
                                int indexCount, const SkPaint& paint) {
     if (d.fRC->isEmpty()) {
         return;
index 7d207e7..4bf4a58 100644 (file)
@@ -116,7 +116,7 @@ public:
     void drawVertices(const SkDraw&, SkCanvas::VertexMode,
                       int vertexCount, const SkPoint verts[],
                       const SkPoint texs[], const SkColor colors[],
-                      SkXfermode* xmode, const uint16_t indices[],
+                      SK_XFERMODE_PARAM, const uint16_t indices[],
                       int indexCount, const SkPaint& paint) override;
     void drawDevice(const SkDraw&, SkBaseDevice*, int x, int y,
                     const SkPaint&) override;
index 31014ff..e7b04ce 100644 (file)
@@ -352,7 +352,7 @@ void SkPipeCanvas::onDrawArc(const SkRect& bounds, SkScalar startAngle, SkScalar
 }
 
 void SkPipeCanvas::onDrawAtlas(const SkImage* image, const SkRSXform xform[], const SkRect rect[],
-                               const SkColor colors[], int count, SkXfermode::Mode mode,
+                               const SkColor colors[], int count, SK_XFERMODE_MODE_PARAM mode,
                                const SkRect* cull, const SkPaint* paint) {
     unsigned extra = (unsigned)mode;
     SkASSERT(0 == (extra & ~kMode_DrawAtlasMask));
@@ -732,7 +732,7 @@ void SkPipeCanvas::onDrawRegion(const SkRegion& region, const SkPaint& paint) {
 
 void SkPipeCanvas::onDrawVertices(VertexMode vmode, int vertexCount,
                                   const SkPoint vertices[], const SkPoint texs[],
-                                  const SkColor colors[], SkXfermode* xmode,
+                                  const SkColor colors[], SK_XFERMODE_PARAM xmode,
                                   const uint16_t indices[], int indexCount,
                                   const SkPaint& paint) {
     SkASSERT(vertexCount > 0);
@@ -743,11 +743,12 @@ void SkPipeCanvas::onDrawVertices(VertexMode vmode, int vertexCount,
     }
     extra |= (unsigned)vmode << kVMode_DrawVerticesShift;
 
-    SkXfermode::Mode mode = SkXfermode::kModulate_Mode;
-    if (xmode && !SkXfermode::AsMode(xmode, &mode)) {
-        mode = (SkXfermode::Mode)0xFF;  // sentinel for read the xfer later
-    }
-    extra |= (unsigned)mode << kXMode_DrawVerticesShift;
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_PARAM
+    SkBlendMode bmode = xmode ? xmode->blend() : SkBlendMode::kModulate;
+#else
+    SkBlendMode bmode = xmode;
+#endif
+    extra |= (unsigned)bmode << kXMode_DrawVerticesShift;
 
     if (texs) {
         extra |= kHasTex_DrawVerticesMask;
@@ -764,9 +765,6 @@ void SkPipeCanvas::onDrawVertices(VertexMode vmode, int vertexCount,
     if (vertexCount > kVCount_DrawVerticesMask) {
         writer.write32(vertexCount);
     }
-    if (mode == (SkXfermode::Mode)0xFF) {
-        writer.writeFlattenable(xmode);
-    }
     writer.write(vertices, vertexCount * sizeof(SkPoint));
     if (texs) {
         writer.write(texs, vertexCount * sizeof(SkPoint));
@@ -783,18 +781,17 @@ void SkPipeCanvas::onDrawVertices(VertexMode vmode, int vertexCount,
 }
 
 void SkPipeCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
-                               const SkPoint texCoords[4], SkXfermode* xfer,
+                               const SkPoint texCoords[4], SK_XFERMODE_PARAM xmode,
                                const SkPaint& paint) {
     SkPipeWriter writer(this);
     unsigned extra = 0;
-    SkXfermode::Mode mode = SkXfermode::kModulate_Mode;
-    if (xfer && !xfer->asMode(&mode)) {
-        mode = (SkXfermode::Mode)kExplicitXfer_DrawPatchExtraValue;
-    } else {
-        xfer = nullptr;    // signal that we're using the mode enum
-    }
-    SkASSERT(0 == (mode & ~kModeEnum_DrawPatchExtraMask));
-    extra = (unsigned)mode;
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_PARAM
+    SkBlendMode bmode = xmode ? xmode->blend() : SkBlendMode::kModulate;
+#else
+    SkBlendMode bmode = xmode;
+#endif
+    SkASSERT(0 == ((int)bmode & ~kModeEnum_DrawPatchExtraMask));
+    extra = (unsigned)bmode;
     if (colors) {
         extra |= kHasColors_DrawPatchExtraMask;
     }
@@ -809,9 +806,6 @@ void SkPipeCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4]
     if (texCoords) {
         writer.write(texCoords, sizeof(SkPoint) * 4);
     }
-    if (xfer) {
-        xfer->flatten(writer);
-    }
     write_paint(writer, paint, kGeometry_PaintUsage);
 }
 
index 33f7821..87a906f 100644 (file)
@@ -105,7 +105,7 @@ protected:
     void onDrawArc(const SkRect&, SkScalar startAngle, SkScalar sweepAngle, bool useCenter,
                    const SkPaint&) override;
     void onDrawAtlas(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[],
-                     int count, SkXfermode::Mode, const SkRect* cull, const SkPaint*) override;
+                     int count, SK_XFERMODE_MODE_PARAM, const SkRect* cull, const SkPaint*) override;
     void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override;
     void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
                     const SkPaint&) override;
@@ -119,7 +119,7 @@ protected:
     void onDrawTextRSXform(const void* text, size_t byteLength, const SkRSXform xform[],
                            const SkRect* cull, const SkPaint& paint) override;
     void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], const SkPoint texCoords[4],
-                     SkXfermode*, const SkPaint&) override;
+                     SK_XFERMODE_PARAM, const SkPaint&) override;
 
     void onDrawPaint(const SkPaint&) override;
     void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&) override;
@@ -138,7 +138,7 @@ protected:
                             const SkPaint*) override;
     void onDrawVertices(VertexMode vmode, int vertexCount,
                               const SkPoint vertices[], const SkPoint texs[],
-                              const SkColor colors[], SkXfermode* xmode,
+                              const SkColor colors[], SK_XFERMODE_PARAM,
                               const uint16_t indices[], int indexCount,
                               const SkPaint&) override;
 
index 31718e9..2039bf2 100644 (file)
@@ -310,7 +310,7 @@ static void drawArc_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas*
 
 static void drawAtlas_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
     SkASSERT(SkPipeVerb::kDrawAtlas == unpack_verb(packedVerb));
-    SkXfermode::Mode mode = (SkXfermode::Mode)(packedVerb & kMode_DrawAtlasMask);
+    SkBlendMode mode = (SkBlendMode)(packedVerb & kMode_DrawAtlasMask);
     sk_sp<SkImage> image(reader.readImage());
     int count = reader.read32();
     const SkRSXform* xform = skip<SkRSXform>(reader, count);
@@ -433,16 +433,8 @@ static void drawPatch_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanva
     if (packedVerb & kHasTexture_DrawPatchExtraMask) {
         tex = skip<SkPoint>(reader, 4);
     }
-    sk_sp<SkXfermode> xfer;
-    unsigned mode = packedVerb & kModeEnum_DrawPatchExtraMask;
-    if (kExplicitXfer_DrawPatchExtraValue == mode) {
-        xfer = reader.readXfermode();
-    } else {
-        if (mode != SkXfermode::kSrcOver_Mode) {
-            xfer = SkXfermode::Make((SkXfermode::Mode)mode);
-        }
-    }
-    canvas->drawPatch(cubics, colors, tex, xfer.get(), read_paint(reader));
+    SkBlendMode mode = (SkBlendMode)(packedVerb & kModeEnum_DrawPatchExtraMask);
+    canvas->drawPatch(cubics, colors, tex, mode, read_paint(reader));
 }
 
 static void drawPaint_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas* canvas) {
@@ -581,13 +573,8 @@ static void drawVertices_handler(SkPipeReader& reader, uint32_t packedVerb, SkCa
     if (0 == vertexCount) {
         vertexCount = reader.read32();
     }
-    sk_sp<SkXfermode> xfer;
-    unsigned xmode = (packedVerb & kXMode_DrawVerticesMask) >> kXMode_DrawVerticesShift;
-    if (0xFF == xmode) {
-        xfer = reader.readXfermode();
-    } else {
-        xfer = SkXfermode::Make((SkXfermode::Mode)xmode);
-    }
+    SkBlendMode bmode = (SkBlendMode)
+            ((packedVerb & kXMode_DrawVerticesMask) >> kXMode_DrawVerticesShift);
     const SkPoint* vertices = skip<SkPoint>(reader, vertexCount);
     const SkPoint* texs = nullptr;
     if (packedVerb & kHasTex_DrawVerticesMask) {
@@ -604,7 +591,7 @@ static void drawVertices_handler(SkPipeReader& reader, uint32_t packedVerb, SkCa
         indices = skip<uint16_t>(reader, indexCount);
     }
 
-    canvas->drawVertices(vmode, vertexCount, vertices, texs, colors, xfer.get(),
+    canvas->drawVertices(vmode, vertexCount, vertices, texs, colors, bmode,
                          indices, indexCount, read_paint(reader));
 }
 
index 16e2b3f..b07e0aa 100644 (file)
@@ -799,7 +799,7 @@ void SkSVGDevice::drawTextOnPath(const SkDraw&, const void* text, size_t len, co
 
 void SkSVGDevice::drawVertices(const SkDraw&, SkCanvas::VertexMode, int vertexCount,
                                const SkPoint verts[], const SkPoint texs[],
-                               const SkColor colors[], SkXfermode* xmode,
+                               const SkColor colors[], SK_XFERMODE_PARAM xmode,
                                const uint16_t indices[], int indexCount,
                                const SkPaint& paint) {
     // todo
index cb13ffd..d0b9a24 100644 (file)
@@ -47,7 +47,7 @@ protected:
                         const SkPaint& paint) override;
     void drawVertices(const SkDraw&, SkCanvas::VertexMode, int vertexCount,
                       const SkPoint verts[], const SkPoint texs[],
-                      const SkColor colors[], SkXfermode* xmode,
+                      const SkColor colors[], SK_XFERMODE_PARAM xmode,
                       const uint16_t indices[], int indexCount,
                       const SkPaint& paint) override;
 
index d2d75fe..6a6af0f 100644 (file)
@@ -513,7 +513,7 @@ void SkDeferredCanvas::onDrawDrawable(SkDrawable* drawable, const SkMatrix* matr
 
 void SkDeferredCanvas::onDrawAtlas(const SkImage* image, const SkRSXform xform[],
                                    const SkRect rects[], const SkColor colors[],
-                                   int count, SkXfermode::Mode mode,
+                                   int count, SK_XFERMODE_MODE_PARAM mode,
                                    const SkRect* cull, const SkPaint* paint) {
     this->flush_before_saves();
     fCanvas->drawAtlas(image, xform, rects, colors, count, mode, cull, paint);
@@ -521,7 +521,7 @@ void SkDeferredCanvas::onDrawAtlas(const SkImage* image, const SkRSXform xform[]
 
 void SkDeferredCanvas::onDrawVertices(VertexMode vmode, int vertexCount,
                                   const SkPoint vertices[], const SkPoint texs[],
-                                  const SkColor colors[], SkXfermode* xmode,
+                                  const SkColor colors[], SK_XFERMODE_PARAM xmode,
                                   const uint16_t indices[], int indexCount,
                                   const SkPaint& paint) {
     this->flush_before_saves();
@@ -530,7 +530,7 @@ void SkDeferredCanvas::onDrawVertices(VertexMode vmode, int vertexCount,
 }
 
 void SkDeferredCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
-                               const SkPoint texCoords[4], SkXfermode* xmode,
+                               const SkPoint texCoords[4], SK_XFERMODE_PARAM xmode,
                                const SkPaint& paint) {
     this->flush_before_saves();
     fCanvas->drawPatch(cubics, colors, texCoords, xmode, paint);
index 68574ca..b48b9b6 100644 (file)
@@ -57,7 +57,7 @@ protected:
     virtual void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
                                 const SkPaint& paint) override;
     virtual void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
-                             const SkPoint texCoords[4], SkXfermode* xmode,
+                             const SkPoint texCoords[4], SK_XFERMODE_PARAM xmode,
                              const SkPaint& paint) override;
 
     void onDrawPaint(const SkPaint&) override;
@@ -87,12 +87,12 @@ protected:
 
     void onDrawVertices(VertexMode vmode, int vertexCount,
                               const SkPoint vertices[], const SkPoint texs[],
-                              const SkColor colors[], SkXfermode* xmode,
+                              const SkColor colors[], SK_XFERMODE_PARAM xmode,
                               const uint16_t indices[], int indexCount,
                               const SkPaint&) override;
     void onDrawAtlas(const SkImage* image, const SkRSXform xform[],
                      const SkRect rects[], const SkColor colors[],
-                     int count, SkXfermode::Mode mode,
+                     int count, SK_XFERMODE_MODE_PARAM mode,
                      const SkRect* cull, const SkPaint* paint) override;
 
     void onClipRect(const SkRect&, ClipOp, ClipEdgeStyle) override;
index eb56068..8b71975 100644 (file)
@@ -468,7 +468,7 @@ void SkDumpCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matri
 
 void SkDumpCanvas::onDrawVertices(VertexMode vmode, int vertexCount,
                                   const SkPoint vertices[], const SkPoint texs[],
-                                  const SkColor colors[], SkXfermode* xmode,
+                                  const SkColor colors[], SK_XFERMODE_PARAM xmode,
                                   const uint16_t indices[], int indexCount,
                                   const SkPaint& paint) {
     this->dump(kDrawVertices_Verb, &paint, "drawVertices(%s [%d] %g %g ...)",
@@ -477,7 +477,7 @@ void SkDumpCanvas::onDrawVertices(VertexMode vmode, int vertexCount,
 }
 
 void SkDumpCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
-                               const SkPoint texCoords[4], SkXfermode* xmode,
+                               const SkPoint texCoords[4], SK_XFERMODE_PARAM xmode,
                                const SkPaint& paint) {
     //dumps corner points and colors in clockwise order starting on upper-left corner
     this->dump(kDrawPatch_Verb, &paint, "drawPatch(Vertices{[%f, %f], [%f, %f], [%f, %f], [%f, %f]}\
index ba311af..14f074c 100644 (file)
@@ -573,7 +573,7 @@ static int lcanvas_drawPatch(lua_State* L) {
         texs = texStorage;
     }
 
-    get_ref<SkCanvas>(L, 1)->drawPatch(cubics, colors, texs, nullptr, *get_obj<SkPaint>(L, 5));
+    get_ref<SkCanvas>(L, 1)->drawPatch(cubics, colors, texs, *get_obj<SkPaint>(L, 5));
     return 0;
 }
 
index 6b769f0..10fc3b4 100644 (file)
@@ -309,7 +309,7 @@ void SkLuaCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matrix
 
 void SkLuaCanvas::onDrawVertices(VertexMode vmode, int vertexCount,
                                  const SkPoint vertices[], const SkPoint texs[],
-                                 const SkColor colors[], SkXfermode* xmode,
+                                 const SkColor colors[], SK_XFERMODE_PARAM,
                                  const uint16_t indices[], int indexCount,
                                  const SkPaint& paint) {
     AUTO_LUA("drawVertices");
index 27eccc2..4c9c0d0 100644 (file)
@@ -95,7 +95,7 @@ void SkMeshUtils::Draw(SkCanvas* canvas, const SkBitmap& bitmap,
                                          SkShader::kClamp_TileMode,
                                          SkShader::kClamp_TileMode));
         canvas->drawVertices(SkCanvas::kTriangles_VertexMode,
-                             rows * cols, verts, idx.tex(), colors, nullptr,
+                             rows * cols, verts, idx.tex(), colors, SkBlendMode::kModulate,
                              idx.indices(), idx.indexCount(), p);
     }
 }
index e19e7a8..aa9f767 100644 (file)
@@ -288,7 +288,7 @@ void SkNWayCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matri
 
 void SkNWayCanvas::onDrawVertices(VertexMode vmode, int vertexCount,
                                   const SkPoint vertices[], const SkPoint texs[],
-                                  const SkColor colors[], SkXfermode* xmode,
+                                  const SkColor colors[], SK_XFERMODE_PARAM xmode,
                                   const uint16_t indices[], int indexCount,
                                   const SkPaint& paint) {
     Iter iter(fList);
@@ -299,7 +299,7 @@ void SkNWayCanvas::onDrawVertices(VertexMode vmode, int vertexCount,
 }
 
 void SkNWayCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
-                               const SkPoint texCoords[4], SkXfermode* xmode,
+                               const SkPoint texCoords[4], SK_XFERMODE_PARAM xmode,
                                const SkPaint& paint) {
     Iter iter(fList);
     while (iter.next()) {
index 910647d..d3cc4c7 100644 (file)
@@ -151,7 +151,7 @@ void SkPaintFilterCanvas::onDrawImageNine(const SkImage* image, const SkIRect& c
 
 void SkPaintFilterCanvas::onDrawVertices(VertexMode vmode, int vertexCount,
                                          const SkPoint vertices[], const SkPoint texs[],
-                                         const SkColor colors[], SkXfermode* xmode,
+                                         const SkColor colors[], SK_XFERMODE_PARAM xmode,
                                          const uint16_t indices[], int indexCount,
                                          const SkPaint& paint) {
     AutoPaintFilter apf(this, kVertices_Type, paint);
@@ -162,7 +162,7 @@ void SkPaintFilterCanvas::onDrawVertices(VertexMode vmode, int vertexCount,
 }
 
 void SkPaintFilterCanvas::onDrawPatch(const SkPoint cubics[], const SkColor colors[],
-                                      const SkPoint texCoords[], SkXfermode* xmode,
+                                      const SkPoint texCoords[], SK_XFERMODE_PARAM xmode,
                                       const SkPaint& paint) {
     AutoPaintFilter apf(this, kPatch_Type, paint);
     if (apf.shouldDraw()) {
index 3b7c06e..ee30ce1 100644 (file)
@@ -8,7 +8,7 @@
 #include "SkPatchGrid.h"
 #include "SkPatchUtils.h"
 
-SkPatchGrid::SkPatchGrid(int rows, int cols, VertexType flags, SkXfermode* xfer)
+SkPatchGrid::SkPatchGrid(int rows, int cols, VertexType flags)
     : fRows(0)
     , fCols(0)
     , fModeFlags(kNone_VertexType)
@@ -17,8 +17,8 @@ SkPatchGrid::SkPatchGrid(int rows, int cols, VertexType flags, SkXfermode* xfer)
     , fTexCoords(nullptr)
     , fHrzCtrlPts(nullptr)
     , fVrtCtrlPts(nullptr)
-    , fXferMode(nullptr) {
-        this->reset(rows, cols, flags, xfer);
+{
+    this->reset(rows, cols, flags, SkBlendMode::kModulate);
 }
 
 SkPatchGrid::~SkPatchGrid() {
@@ -119,7 +119,7 @@ bool SkPatchGrid::getPatch(int x, int y, SkPoint cubics[12], SkColor colors[4],
     return true;
 }
 
-void SkPatchGrid::reset(int rows, int cols, VertexType flags, SkXfermode* xMode) {
+void SkPatchGrid::reset(int rows, int cols, VertexType flags, SkBlendMode blendmode) {
     delete[] fCornerPts;
     delete[] fCornerColors;
     delete[] fTexCoords;
@@ -129,7 +129,7 @@ void SkPatchGrid::reset(int rows, int cols, VertexType flags, SkXfermode* xMode)
     fCols = cols;
     fRows = rows;
     fModeFlags = flags;
-    fXferMode = xMode;
+    fBlendMode = blendmode;
 
     fCornerPts = new SkPoint[(fRows + 1) * (fCols + 1)];
     fHrzCtrlPts = new SkPoint[(fRows + 1) * fCols * 2];
@@ -179,7 +179,7 @@ void SkPatchGrid::draw(SkCanvas* canvas, SkPaint& paint) {
                                             fModeFlags & kTexs_VertexType ? texCoords : nullptr,
                                             maxCols[x], maxRows[y])) {
                 canvas->drawVertices(SkCanvas::kTriangles_VertexMode, data.fVertexCount,
-                                     data.fPoints, data.fTexCoords, data.fColors, fXferMode,
+                                     data.fPoints, data.fTexCoords, data.fColors, fBlendMode,
                                      data.fIndices, data.fIndexCount, paint);
             }
         }
index ca2a35b..dbb6138 100644 (file)
@@ -87,8 +87,7 @@ public:
         kColorsAndTexs_VertexType = 0x03
     };
 
-    SkPatchGrid(int rows = 0, int cols = 0, VertexType flags = kNone_VertexType,
-                SkXfermode* xfer = nullptr);
+    SkPatchGrid(int rows = 0, int cols = 0, VertexType flags = kNone_VertexType);
 
     ~SkPatchGrid();
 
@@ -113,7 +112,7 @@ public:
     /**
      * Resets the grid of patches to contain rows and cols of patches.
      */
-    void reset(int rows, int cols, VertexType flags, SkXfermode* xMode);
+    void reset(int rows, int cols, VertexType flags, SkBlendMode);
 
     /**
      * Draws the grid of patches. The patches are drawn starting at patch (0,0) drawing columns, so
@@ -137,7 +136,7 @@ private:
     SkPoint* fTexCoords;
     SkPoint* fHrzCtrlPts;
     SkPoint* fVrtCtrlPts;
-    SkXfermode* fXferMode;
+    SkBlendMode fBlendMode = SkBlendMode::kModulate;
 };
 
 
index 946566c..7eb1587 100644 (file)
@@ -1181,7 +1181,7 @@ void SkXPSDevice::drawPoints(const SkDraw& d, SkCanvas::PointMode mode,
 void SkXPSDevice::drawVertices(const SkDraw&, SkCanvas::VertexMode,
                                int vertexCount, const SkPoint verts[],
                                const SkPoint texs[], const SkColor colors[],
-                               SkXfermode* xmode, const uint16_t indices[],
+                               SK_XFERMODE_PARAM xmode, const uint16_t indices[],
                                int indexCount, const SkPaint& paint) {
     //TODO: override this for XPS
     SkDEBUGF(("XPS drawVertices not yet implemented."));
index 9f660a7..1f66186 100644 (file)
@@ -127,7 +127,7 @@ protected:
         SkCanvas::VertexMode,
         int vertexCount, const SkPoint verts[],
         const SkPoint texs[], const SkColor colors[],
-        SkXfermode* xmode,
+        SK_XFERMODE_PARAM xmode,
         const uint16_t indices[], int indexCount,
         const SkPaint& paint) override;
 
index 99b7921..b4a4a64 100644 (file)
@@ -172,7 +172,7 @@ struct Mesh {
 
     void draw(SkCanvas* canvas, SkPaint* paint) {
         canvas->drawVertices(SkCanvas::kTriangleFan_VertexMode, 4, fPts, fPts,
-                             nullptr, nullptr, nullptr, 0, *paint);
+                             nullptr, SkBlendMode::kModulate, nullptr, 0, *paint);
     }
 };
 
index d9fca98..4e9a246 100644 (file)
@@ -454,7 +454,7 @@ static void make_noop_layer(SkLayerDrawLooper::Builder* builder) {
     SkLayerDrawLooper::LayerInfo info;
 
     info.fPaintBits = 0;
-    info.fColorMode = SkXfermode::kDst_Mode;
+    info.fColorMode = (SK_XFERMODE_MODE_PARAM)SkBlendMode::kDst;
     builder->addLayer(info);
 }
 
@@ -462,7 +462,7 @@ static void make_blur_layer(SkLayerDrawLooper::Builder* builder, sk_sp<SkMaskFil
     SkLayerDrawLooper::LayerInfo info;
 
     info.fPaintBits = SkLayerDrawLooper::kMaskFilter_Bit;
-    info.fColorMode = SkXfermode::kSrc_Mode;
+    info.fColorMode = (SK_XFERMODE_MODE_PARAM)SkBlendMode::kSrc;
     SkPaint* paint = builder->addLayer(info);
     paint->setMaskFilter(std::move(mf));
 }
index 2be83f3..c062e6c 100644 (file)
@@ -384,7 +384,7 @@ static void DrawVerticesShaderTestStep(SkCanvas* canvas, const TestData& d,
     paint.setShader(SkShader::MakeBitmapShader(d.fBitmap, SkShader::kClamp_TileMode,
                                                SkShader::kClamp_TileMode));
     canvas->drawVertices(SkCanvas::kTriangleFan_VertexMode, 4, pts, pts,
-                         nullptr, nullptr, nullptr, 0, paint);
+                         nullptr, SkBlendMode::kModulate, nullptr, 0, paint);
 }
 // NYI: issue 240.
 TEST_STEP_NO_PDF(DrawVerticesShader, DrawVerticesShaderTestStep);
index 9dfadbb..5d4ef86 100644 (file)
@@ -32,7 +32,7 @@ static sk_sp<SkColorFilter> reincarnate_colorfilter(SkFlattenable* obj) {
 
 static sk_sp<SkColorFilter> make_filter() {
     // pick a filter that cannot compose with itself via newComposed()
-    return SkColorFilter::MakeModeFilter(SK_ColorRED, SkXfermode::kColorBurn_Mode);
+    return SkColorFilter::MakeModeFilter(SK_ColorRED, SkBlendMode::kColorBurn);
 }
 
 static void test_composecolorfilter_limit(skiatest::Reporter* reporter) {
@@ -50,43 +50,43 @@ static void test_composecolorfilter_limit(skiatest::Reporter* reporter) {
     REPORTER_ASSERT(reporter, false); // we never saw a nullptr :(
 }
 
-#define ILLEGAL_MODE    ((SkXfermode::Mode)-1)
+#define ILLEGAL_MODE    ((SkBlendMode)-1)
 
 DEF_TEST(ColorFilter, reporter) {
     SkRandom rand;
 
-    for (int mode = 0; mode <= SkXfermode::kLastMode; mode++) {
+    for (int mode = 0; mode <= (int)SkBlendMode::kLastMode; mode++) {
         SkColor color = rand.nextU();
 
         // ensure we always get a filter, by avoiding the possibility of a
         // special case that would return nullptr (if color's alpha is 0 or 0xFF)
         color = SkColorSetA(color, 0x7F);
 
-        auto cf = SkColorFilter::MakeModeFilter(color, (SkXfermode::Mode)mode);
+        auto cf = SkColorFilter::MakeModeFilter(color, (SkBlendMode)mode);
 
         // allow for no filter if we're in Dst mode (its a no op)
-        if (SkXfermode::kDst_Mode == mode && nullptr == cf) {
+        if (SkBlendMode::kDst == (SkBlendMode)mode && nullptr == cf) {
             continue;
         }
 
         REPORTER_ASSERT(reporter, cf);
 
         SkColor c = ~color;
-        SkXfermode::Mode m = ILLEGAL_MODE;
+        SkBlendMode m = ILLEGAL_MODE;
 
         SkColor expectedColor = color;
-        SkXfermode::Mode expectedMode = (SkXfermode::Mode)mode;
+        SkBlendMode expectedMode = (SkBlendMode)mode;
 
 //        SkDebugf("--- mc [%d %x] ", mode, color);
 
-        REPORTER_ASSERT(reporter, cf->asColorMode(&c, &m));
+        REPORTER_ASSERT(reporter, cf->asColorMode(&c, (SK_XFERMODE_MODE_PARAM*)&m));
         // handle special-case folding by the factory
-        if (SkXfermode::kClear_Mode == mode) {
+        if (SkBlendMode::kClear == (SkBlendMode)mode) {
             if (c != expectedColor) {
                 expectedColor = 0;
             }
             if (m != expectedMode) {
-                expectedMode = SkXfermode::kSrc_Mode;
+                expectedMode = SkBlendMode::kSrc;
             }
         }
 
@@ -100,8 +100,8 @@ DEF_TEST(ColorFilter, reporter) {
             REPORTER_ASSERT(reporter, cf2);
 
             SkColor c2 = ~color;
-            SkXfermode::Mode m2 = ILLEGAL_MODE;
-            REPORTER_ASSERT(reporter, cf2->asColorMode(&c2, &m2));
+            SkBlendMode m2 = ILLEGAL_MODE;
+            REPORTER_ASSERT(reporter, cf2->asColorMode(&c2, (SK_XFERMODE_MODE_PARAM*)&m2));
             REPORTER_ASSERT(reporter, c2 == expectedColor);
             REPORTER_ASSERT(reporter, m2 == expectedMode);
         }
index 25c8f82..327640c 100644 (file)
@@ -42,7 +42,7 @@ static void test_far_from_origin(GrRenderTargetContext* renderTargetContext, GrP
     shape = shape.applyStyle(GrStyle::Apply::kPathEffectAndStrokeRec, 1.f);
 
     GrPaint paint;
-    paint.setXPFactory(GrPorterDuffXPFactory::Make(SkXfermode::kSrc_Mode));
+    paint.setXPFactory(GrPorterDuffXPFactory::Make(SkBlendMode::kSrc));
 
     GrNoClip noClip;
     GrPathRenderer::DrawPathArgs args;
index cb6f350..94afec1 100644 (file)
@@ -203,8 +203,8 @@ static sk_sp<GrFragmentProcessor> create_random_proc_tree(GrProcessorTestData* d
     }
     sk_sp<GrFragmentProcessor> minLevelsChild(create_random_proc_tree(d, minLevels, maxLevels - 1));
     sk_sp<GrFragmentProcessor> otherChild(create_random_proc_tree(d, 1, maxLevels - 1));
-    SkXfermode::Mode mode = static_cast<SkXfermode::Mode>(d->fRandom->nextRangeU(0,
-                                                          SkXfermode::kLastCoeffMode));
+    SkBlendMode mode = static_cast<SkBlendMode>(d->fRandom->nextRangeU(0,
+                                                               (int)SkBlendMode::kLastCoeffMode));
     sk_sp<GrFragmentProcessor> fp;
     if (d->fRandom->nextF() < 0.5f) {
         fp = GrXfermodeFragmentProcessor::MakeFromTwoProcessors(std::move(minLevelsChild),
@@ -366,7 +366,7 @@ bool GrDrawingManager::ProgramUnitTest(GrContext* context, int maxStages) {
             GrProcessorTestData ptd(&random, context, context->caps(),
                                     renderTargetContext.get(), dummyTextures);
             GrPaint grPaint;
-            grPaint.setXPFactory(GrPorterDuffXPFactory::Make(SkXfermode::kSrc_Mode));
+            grPaint.setXPFactory(GrPorterDuffXPFactory::Make(SkBlendMode::kSrc));
 
             sk_sp<GrFragmentProcessor> fp(
                 GrProcessorTestFactory<GrFragmentProcessor>::MakeIdx(i, &ptd));
index 723e9e9..d93f1b7 100644 (file)
@@ -39,7 +39,7 @@ DEF_GPUTEST_FOR_ALL_CONTEXTS(GpuColorFilter, reporter, ctxInfo) {
         GrColor inputColor;       // "[color]"
 
         SkColor filterColor;      // "with filter color [color]"
-        SkXfermode::Mode filterMode; // "in mode [mode]"
+        SkBlendMode filterMode; // "in mode [mode]"
 
         // "produces"
         uint32_t outputComponents; // "rgb of", "red of", "alpha of", ...
@@ -69,30 +69,30 @@ DEF_GPUTEST_FOR_ALL_CONTEXTS(GpuColorFilter, reporter, ctxInfo) {
 
     GetConstantComponentTestCase filterTests[] = {
         // A color filtered with Clear produces black.
-        { kRGBA, gr_white, SK_ColorBLACK, SkXfermode::kClear_Mode, kRGBA, gr_black },
-        { kRGBA, gr_c1,    SK_ColorWHITE, SkXfermode::kClear_Mode, kRGBA, gr_black },
-        { kR,    gr_white, c1,            SkXfermode::kClear_Mode, kRGBA, gr_black },
+        { kRGBA, gr_white, SK_ColorBLACK, SkBlendMode::kClear, kRGBA, gr_black },
+        { kRGBA, gr_c1,    SK_ColorWHITE, SkBlendMode::kClear, kRGBA, gr_black },
+        { kR,    gr_white, c1,            SkBlendMode::kClear, kRGBA, gr_black },
 
         // A color filtered with a color in mode Src, produces the filter color.
-        { kRGBA, gr_c2, c1, SkXfermode::kSrc_Mode, kRGBA, gr_c1 },
-        { kA,    gr_c1, c1, SkXfermode::kSrc_Mode, kRGBA, gr_c1 },
+        { kRGBA, gr_c2, c1, SkBlendMode::kSrc, kRGBA, gr_c1 },
+        { kA,    gr_c1, c1, SkBlendMode::kSrc, kRGBA, gr_c1 },
 
         // A color filtered with SrcOver produces a color.
-        { kRGBA, gr_whiteTrans, SkColorSetARGB(128, 200, 200, 200), SkXfermode::kSrcOver_Mode, kRGBA, GrColorPackRGBA(164, 164, 164, 192)},
+        { kRGBA, gr_whiteTrans, SkColorSetARGB(128, 200, 200, 200), SkBlendMode::kSrcOver, kRGBA, GrColorPackRGBA(164, 164, 164, 192)},
         // An unknown color with known alpha filtered with SrcOver produces an unknown color with known alpha.
-        { kA   , gr_whiteTrans, SkColorSetARGB(128, 200, 200, 200), SkXfermode::kSrcOver_Mode, kA   , GrColorPackRGBA(0, 0, 0, 192)},
+        { kA   , gr_whiteTrans, SkColorSetARGB(128, 200, 200, 200), SkBlendMode::kSrcOver, kA   , GrColorPackRGBA(0, 0, 0, 192)},
         // A color with unknown alpha filtered with SrcOver produces a color with unknown alpha.
-        { kRGB , gr_whiteTrans, SkColorSetARGB(128, 200, 200, 200), SkXfermode::kSrcOver_Mode, kRGB, GrColorPackRGBA(164, 164, 164, 0)},
+        { kRGB , gr_whiteTrans, SkColorSetARGB(128, 200, 200, 200), SkBlendMode::kSrcOver, kRGB, GrColorPackRGBA(164, 164, 164, 0)},
 
         // A color filtered with DstOver produces a color.
-        { kRGBA, gr_whiteTrans, SkColorSetARGB(128, 200, 200, 200), SkXfermode::kDstOver_Mode, kRGBA, GrColorPackRGBA(178, 178, 178, 192)},
+        { kRGBA, gr_whiteTrans, SkColorSetARGB(128, 200, 200, 200), SkBlendMode::kDstOver, kRGBA, GrColorPackRGBA(178, 178, 178, 192)},
         // An unknown color with known alpha filtered with DstOver produces an unknown color with known alpha.
-        { kA   , gr_whiteTrans, SkColorSetARGB(128, 200, 200, 200), SkXfermode::kDstOver_Mode, kA   , GrColorPackRGBA(0, 0, 0, 192)},
+        { kA   , gr_whiteTrans, SkColorSetARGB(128, 200, 200, 200), SkBlendMode::kDstOver, kA   , GrColorPackRGBA(0, 0, 0, 192)},
         // A color with unknown alpha filtered with DstOver produces an unknown color.
-        { kRGB , gr_whiteTrans, SkColorSetARGB(128, 200, 200, 200), SkXfermode::kDstOver_Mode, 0    , gr_black},
+        { kRGB , gr_whiteTrans, SkColorSetARGB(128, 200, 200, 200), SkBlendMode::kDstOver, 0    , gr_black},
 
         // An unknown color with known alpha and red component filtered with Multiply produces an unknown color with known red and alpha.
-        { kR|kA , gr_whiteTrans, SkColorSetARGB(128, 200, 200, 200), SkXfermode::kModulate_Mode, kR|kA, GrColorPackRGBA(50, 0, 0, 64) }
+        { kR|kA , gr_whiteTrans, SkColorSetARGB(128, 200, 200, 200), SkBlendMode::kModulate, kR|kA, GrColorPackRGBA(50, 0, 0, 64) }
     };
 
     GrPaint paint;
index 719f787..ec57377 100644 (file)
@@ -67,7 +67,7 @@ enum {
 class GrPorterDuffTest {
 public:
     struct XPInfo {
-        XPInfo(skiatest::Reporter* reporter, SkXfermode::Mode xfermode, const GrCaps& caps,
+        XPInfo(skiatest::Reporter* reporter, SkBlendMode xfermode, const GrCaps& caps,
                const GrPipelineOptimizations& optimizations) {
             sk_sp<GrXPFactory> xpf(GrPorterDuffXPFactory::Make(xfermode));
             SkAutoTUnref<GrXferProcessor> xp(
@@ -104,12 +104,12 @@ static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps)
     SkASSERT(!opt.fCoveragePOI.isSolidWhite());
     SkASSERT(opt.fCoveragePOI.isFourChannelOutput());
 
-    for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) {
-        SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m);
+    for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
+        SkBlendMode xfermode = static_cast<SkBlendMode>(m);
         const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, opt);
 
         switch (xfermode) {
-            case SkXfermode::kClear_Mode:
+            case SkBlendMode::kClear:
                 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
                 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
@@ -121,7 +121,7 @@ static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps)
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kSrc_Mode:
+            case SkBlendMode::kSrc:
                 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
@@ -132,7 +132,7 @@ static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps)
                 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kDst_Mode:
+            case SkBlendMode::kDst:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kSkipDraw_OptFlag |
@@ -146,7 +146,7 @@ static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps)
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kSrcOver_Mode:
+            case SkBlendMode::kSrcOver:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
@@ -157,7 +157,7 @@ static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps)
                 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kDstOver_Mode:
+            case SkBlendMode::kDstOver:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
@@ -168,7 +168,7 @@ static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps)
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kSrcIn_Mode:
+            case SkBlendMode::kSrcIn:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
@@ -179,7 +179,7 @@ static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps)
                 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kDstIn_Mode:
+            case SkBlendMode::kDstIn:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
@@ -190,7 +190,7 @@ static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps)
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kSrcOut_Mode:
+            case SkBlendMode::kSrcOut:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
@@ -201,7 +201,7 @@ static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps)
                 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kDstOut_Mode:
+            case SkBlendMode::kDstOut:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
@@ -212,7 +212,7 @@ static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps)
                 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kSrcATop_Mode:
+            case SkBlendMode::kSrcATop:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
@@ -223,7 +223,7 @@ static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps)
                 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kDstATop_Mode:
+            case SkBlendMode::kDstATop:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
@@ -234,7 +234,7 @@ static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps)
                 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kXor_Mode:
+            case SkBlendMode::kXor:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
@@ -245,7 +245,7 @@ static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps)
                 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kPlus_Mode:
+            case SkBlendMode::kPlus:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
@@ -256,7 +256,7 @@ static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps)
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kModulate_Mode:
+            case SkBlendMode::kModulate:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
@@ -267,7 +267,7 @@ static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps)
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kScreen_Mode:
+            case SkBlendMode::kScreen:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
@@ -296,13 +296,13 @@ static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const
     SkASSERT(!optimizations.fCoveragePOI.isSolidWhite());
     SkASSERT(!optimizations.fCoveragePOI.isFourChannelOutput());
 
-    for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) {
-        SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m);
+    for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
+        SkBlendMode xfermode = static_cast<SkBlendMode>(m);
         const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, optimizations);
 
 
         switch (xfermode) {
-            case SkXfermode::kClear_Mode:
+            case SkBlendMode::kClear:
                 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
                 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
@@ -314,7 +314,7 @@ static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kSrc_Mode:
+            case SkBlendMode::kSrc:
                 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
@@ -325,7 +325,7 @@ static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kDst_Mode:
+            case SkBlendMode::kDst:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kSkipDraw_OptFlag |
@@ -339,7 +339,7 @@ static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kSrcOver_Mode:
+            case SkBlendMode::kSrcOver:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
@@ -350,7 +350,7 @@ static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kDstOver_Mode:
+            case SkBlendMode::kDstOver:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
@@ -361,7 +361,7 @@ static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kSrcIn_Mode:
+            case SkBlendMode::kSrcIn:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
@@ -372,7 +372,7 @@ static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kDstIn_Mode:
+            case SkBlendMode::kDstIn:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
@@ -383,7 +383,7 @@ static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kSrcOut_Mode:
+            case SkBlendMode::kSrcOut:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
@@ -394,7 +394,7 @@ static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kDstOut_Mode:
+            case SkBlendMode::kDstOut:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
@@ -405,7 +405,7 @@ static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kSrcATop_Mode:
+            case SkBlendMode::kSrcATop:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
@@ -416,7 +416,7 @@ static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kDstATop_Mode:
+            case SkBlendMode::kDstATop:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
@@ -427,7 +427,7 @@ static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kXor_Mode:
+            case SkBlendMode::kXor:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
@@ -438,7 +438,7 @@ static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kPlus_Mode:
+            case SkBlendMode::kPlus:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
@@ -449,7 +449,7 @@ static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kModulate_Mode:
+            case SkBlendMode::kModulate:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
@@ -460,7 +460,7 @@ static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kScreen_Mode:
+            case SkBlendMode::kScreen:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
@@ -490,12 +490,12 @@ static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const G
     SkASSERT(optimizations.fCoveragePOI.isSolidWhite());
     SkASSERT(!optimizations.fCoveragePOI.isFourChannelOutput());
 
-    for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) {
-        SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m);
+    for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
+        SkBlendMode xfermode = static_cast<SkBlendMode>(m);
         const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, optimizations);
 
         switch (xfermode) {
-            case SkXfermode::kClear_Mode:
+            case SkBlendMode::kClear:
                 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
                 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
@@ -508,7 +508,7 @@ static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const G
                 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kSrc_Mode:
+            case SkBlendMode::kSrc:
                 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(229 == GrColorUnpackR(xpi.fBlendedColor.fKnownColor));
                 TEST_ASSERT(154 == GrColorUnpackB(xpi.fBlendedColor.fKnownColor));
@@ -522,7 +522,7 @@ static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const G
                 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kDst_Mode:
+            case SkBlendMode::kDst:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kSkipDraw_OptFlag |
@@ -536,7 +536,7 @@ static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const G
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kSrcOver_Mode:
+            case SkBlendMode::kSrcOver:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kIgnoreCoverage_OptFlag |
@@ -548,7 +548,7 @@ static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const G
                 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kDstOver_Mode:
+            case SkBlendMode::kDstOver:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kIgnoreCoverage_OptFlag |
@@ -560,7 +560,7 @@ static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const G
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kSrcIn_Mode:
+            case SkBlendMode::kSrcIn:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
@@ -571,7 +571,7 @@ static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const G
                 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kDstIn_Mode:
+            case SkBlendMode::kDstIn:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
@@ -582,7 +582,7 @@ static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const G
                 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kSrcOut_Mode:
+            case SkBlendMode::kSrcOut:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
@@ -593,7 +593,7 @@ static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const G
                 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kDstOut_Mode:
+            case SkBlendMode::kDstOut:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kIgnoreCoverage_OptFlag |
@@ -605,7 +605,7 @@ static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const G
                 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kSrcATop_Mode:
+            case SkBlendMode::kSrcATop:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kIgnoreCoverage_OptFlag |
@@ -617,7 +617,7 @@ static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const G
                 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kDstATop_Mode:
+            case SkBlendMode::kDstATop:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
@@ -628,7 +628,7 @@ static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const G
                 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kXor_Mode:
+            case SkBlendMode::kXor:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kIgnoreCoverage_OptFlag |
@@ -640,7 +640,7 @@ static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const G
                 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kPlus_Mode:
+            case SkBlendMode::kPlus:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kIgnoreCoverage_OptFlag |
@@ -652,7 +652,7 @@ static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const G
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kModulate_Mode:
+            case SkBlendMode::kModulate:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
@@ -663,7 +663,7 @@ static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const G
                 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kScreen_Mode:
+            case SkBlendMode::kScreen:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kIgnoreCoverage_OptFlag |
@@ -694,12 +694,12 @@ static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const
     SkASSERT(!optimizations.fCoveragePOI.isSolidWhite());
     SkASSERT(!optimizations.fCoveragePOI.isFourChannelOutput());
 
-    for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) {
-        SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m);
+    for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
+        SkBlendMode xfermode = static_cast<SkBlendMode>(m);
         const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, optimizations);
 
         switch (xfermode) {
-            case SkXfermode::kClear_Mode:
+            case SkBlendMode::kClear:
                 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
                 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
@@ -711,7 +711,7 @@ static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kSrc_Mode:
+            case SkBlendMode::kSrc:
                 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(255 == GrColorUnpackA(xpi.fBlendedColor.fKnownColor));
                 TEST_ASSERT(kA_GrColorComponentFlag == xpi.fBlendedColor.fKnownColorFlags);
@@ -723,7 +723,7 @@ static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kDst_Mode:
+            case SkBlendMode::kDst:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kSkipDraw_OptFlag |
@@ -737,7 +737,7 @@ static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kSrcOver_Mode:
+            case SkBlendMode::kSrcOver:
                 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(255 == GrColorUnpackA(xpi.fBlendedColor.fKnownColor));
                 TEST_ASSERT(kA_GrColorComponentFlag == xpi.fBlendedColor.fKnownColorFlags);
@@ -749,7 +749,7 @@ static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kDstOver_Mode:
+            case SkBlendMode::kDstOver:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
@@ -760,7 +760,7 @@ static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kSrcIn_Mode:
+            case SkBlendMode::kSrcIn:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
@@ -771,7 +771,7 @@ static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kDstIn_Mode:
+            case SkBlendMode::kDstIn:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kSkipDraw_OptFlag |
@@ -785,7 +785,7 @@ static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kSrcOut_Mode:
+            case SkBlendMode::kSrcOut:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
@@ -796,7 +796,7 @@ static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kDstOut_Mode:
+            case SkBlendMode::kDstOut:
                 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
                 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
@@ -808,7 +808,7 @@ static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kSrcATop_Mode:
+            case SkBlendMode::kSrcATop:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
@@ -819,7 +819,7 @@ static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kDstATop_Mode:
+            case SkBlendMode::kDstATop:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
@@ -830,7 +830,7 @@ static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kXor_Mode:
+            case SkBlendMode::kXor:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
@@ -841,7 +841,7 @@ static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kPlus_Mode:
+            case SkBlendMode::kPlus:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
@@ -852,7 +852,7 @@ static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kModulate_Mode:
+            case SkBlendMode::kModulate:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
@@ -863,7 +863,7 @@ static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kScreen_Mode:
+            case SkBlendMode::kScreen:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
@@ -893,12 +893,12 @@ static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const Gr
     SkASSERT(optimizations.fCoveragePOI.isSolidWhite());
     SkASSERT(!optimizations.fCoveragePOI.isFourChannelOutput());
 
-    for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) {
-        SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m);
+    for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
+        SkBlendMode xfermode = static_cast<SkBlendMode>(m);
         const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, optimizations);
 
         switch (xfermode) {
-            case SkXfermode::kClear_Mode:
+            case SkBlendMode::kClear:
                 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
                 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
@@ -911,7 +911,7 @@ static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const Gr
                 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kSrc_Mode:
+            case SkBlendMode::kSrc:
                 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(82 == GrColorUnpackG(xpi.fBlendedColor.fKnownColor));
                 TEST_ASSERT(255 == GrColorUnpackA(xpi.fBlendedColor.fKnownColor));
@@ -925,7 +925,7 @@ static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const Gr
                 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kDst_Mode:
+            case SkBlendMode::kDst:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kSkipDraw_OptFlag |
@@ -939,7 +939,7 @@ static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const Gr
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kSrcOver_Mode:
+            case SkBlendMode::kSrcOver:
                 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(82 == GrColorUnpackG(xpi.fBlendedColor.fKnownColor));
                 TEST_ASSERT(255 == GrColorUnpackA(xpi.fBlendedColor.fKnownColor));
@@ -953,7 +953,7 @@ static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const Gr
                 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kDstOver_Mode:
+            case SkBlendMode::kDstOver:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kIgnoreCoverage_OptFlag |
@@ -965,7 +965,7 @@ static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const Gr
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kSrcIn_Mode:
+            case SkBlendMode::kSrcIn:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
@@ -976,7 +976,7 @@ static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const Gr
                 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kDstIn_Mode:
+            case SkBlendMode::kDstIn:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kSkipDraw_OptFlag |
@@ -990,7 +990,7 @@ static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const Gr
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kSrcOut_Mode:
+            case SkBlendMode::kSrcOut:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
@@ -1001,7 +1001,7 @@ static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const Gr
                 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kDstOut_Mode:
+            case SkBlendMode::kDstOut:
                 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
                 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
@@ -1014,7 +1014,7 @@ static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const Gr
                 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kSrcATop_Mode:
+            case SkBlendMode::kSrcATop:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
@@ -1025,7 +1025,7 @@ static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const Gr
                 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kDstATop_Mode:
+            case SkBlendMode::kDstATop:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kIgnoreCoverage_OptFlag |
@@ -1037,7 +1037,7 @@ static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const Gr
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kXor_Mode:
+            case SkBlendMode::kXor:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
@@ -1048,7 +1048,7 @@ static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const Gr
                 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kPlus_Mode:
+            case SkBlendMode::kPlus:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kIgnoreCoverage_OptFlag |
@@ -1060,7 +1060,7 @@ static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const Gr
                 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kModulate_Mode:
+            case SkBlendMode::kModulate:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
@@ -1071,7 +1071,7 @@ static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const Gr
                 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
                 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
                 break;
-            case SkXfermode::kScreen_Mode:
+            case SkBlendMode::kScreen:
                 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
                 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
                 TEST_ASSERT((kIgnoreCoverage_OptFlag |
@@ -1121,7 +1121,7 @@ static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const
     SkASSERT(kRGBA_GrColorComponentFlags == colorPOI.validFlags());
     SkASSERT(covPOI.isFourChannelOutput());
 
-    sk_sp<GrXPFactory> xpf(GrPorterDuffXPFactory::Make(SkXfermode::kSrcOver_Mode));
+    sk_sp<GrXPFactory> xpf(GrPorterDuffXPFactory::Make(SkBlendMode::kSrcOver));
     TEST_ASSERT(!xpf->willNeedDstTexture(caps, opts));
 
     SkAutoTUnref<GrXferProcessor> xp(
@@ -1194,8 +1194,8 @@ DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, /*factory*/) {
                 optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255),
                                                                  kRGBA_GrColorComponentFlags, true);
             }
-            for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) {
-                SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m);
+            for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
+                SkBlendMode xfermode = static_cast<SkBlendMode>(m);
                 sk_sp<GrXPFactory> xpf(GrPorterDuffXPFactory::Make(xfermode));
                 GrXferProcessor::DstTexture* dstTexture =
                     xpf->willNeedDstTexture(caps, optimizations) ? &fakeDstTexture : 0;
index 7f0c69c..42ffd38 100644 (file)
@@ -143,7 +143,7 @@ public:
 
         {
             sk_sp<SkColorFilter> cf(SkColorFilter::MakeModeFilter(SK_ColorRED,
-                                                                  SkXfermode::kSrcIn_Mode));
+                                                                  SkBlendMode::kSrcIn));
 
             this->addFilter("color filter",
                 SkColorFilterImageFilter::Make(std::move(cf), input, cropRect));
@@ -191,7 +191,7 @@ public:
         }
 
         this->addFilter("merge", SkMergeImageFilter::Make(input, input,
-                                                          SkXfermode::kSrcOver_Mode,
+                                                          SkBlendMode::kSrcOver,
                                                           cropRect));
 
         {
@@ -208,7 +208,7 @@ public:
 
             this->addFilter("merge with disjoint inputs", SkMergeImageFilter::Make(
                   std::move(paintFilterLeft), std::move(paintFilterRight),
-                  SkXfermode::kSrcOver_Mode, cropRect));
+                  SkBlendMode::kSrcOver, cropRect));
         }
 
         this->addFilter("offset",
@@ -358,7 +358,7 @@ static sk_sp<SkImageFilter> make_grayscale(sk_sp<SkImageFilter> input,
 static sk_sp<SkImageFilter> make_blue(sk_sp<SkImageFilter> input,
                                       const SkImageFilter::CropRect* cropRect) {
     sk_sp<SkColorFilter> filter(SkColorFilter::MakeModeFilter(SK_ColorBLUE,
-                                                              SkXfermode::kSrcIn_Mode));
+                                                              SkBlendMode::kSrcIn));
     return SkColorFilterImageFilter::Make(std::move(filter), std::move(input), cropRect);
 }
 
@@ -686,7 +686,7 @@ static void test_fail_affects_transparent_black(skiatest::Reporter* reporter, Gr
     sk_sp<SkSpecialImage> source(create_empty_special_image(context, 5));
     SkImageFilter::OutputProperties noColorSpace(nullptr);
     SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeXYWH(0, 0, 1, 1), nullptr, noColorSpace);
-    sk_sp<SkColorFilter> green(SkColorFilter::MakeModeFilter(SK_ColorGREEN, SkXfermode::kSrc_Mode));
+    sk_sp<SkColorFilter> green(SkColorFilter::MakeModeFilter(SK_ColorGREEN, SkBlendMode::kSrc));
     SkASSERT(green->affectsTransparentBlack());
     sk_sp<SkImageFilter> greenFilter(SkColorFilterImageFilter::Make(std::move(green),
                                                                     std::move(failFilter)));
@@ -769,7 +769,7 @@ static void draw_saveLayer_picture(int width, int height, int tileSize,
     SkMatrix matrix;
     matrix.setTranslate(SkIntToScalar(50), 0);
 
-    sk_sp<SkColorFilter> cf(SkColorFilter::MakeModeFilter(SK_ColorWHITE, SkXfermode::kSrc_Mode));
+    sk_sp<SkColorFilter> cf(SkColorFilter::MakeModeFilter(SK_ColorWHITE, SkBlendMode::kSrc));
     sk_sp<SkImageFilter> cfif(SkColorFilterImageFilter::Make(std::move(cf), nullptr));
     sk_sp<SkImageFilter> imageFilter(SkImageFilter::MakeMatrixFilter(matrix,
                                                                      kNone_SkFilterQuality,
@@ -960,7 +960,7 @@ static void test_imagefilter_merge_result_size(skiatest::Reporter* reporter, GrC
     greenBM.eraseColor(SK_ColorGREEN);
     sk_sp<SkImage> greenImage(SkImage::MakeFromBitmap(greenBM));
     sk_sp<SkImageFilter> source(SkImageSource::Make(std::move(greenImage)));
-    sk_sp<SkImageFilter> merge(SkMergeImageFilter::Make(source, source));
+    sk_sp<SkImageFilter> merge(SkMergeImageFilter::Make(source, source, SkBlendMode::kSrcOver));
 
     sk_sp<SkSpecialImage> srcImg(create_empty_special_image(context, 1));
 
@@ -1299,7 +1299,7 @@ DEF_TEST(ImageFilterEmptySaveLayer, reporter) {
     SkPictureRecorder recorder;
 
     sk_sp<SkColorFilter> green(SkColorFilter::MakeModeFilter(SK_ColorGREEN,
-                                                             SkXfermode::kSrc_Mode));
+                                                             SkBlendMode::kSrc));
     sk_sp<SkImageFilter> imageFilter(SkColorFilterImageFilter::Make(green, nullptr));
     SkPaint imageFilterPaint;
     imageFilterPaint.setImageFilter(std::move(imageFilter));
@@ -1425,7 +1425,7 @@ static void test_xfermode_cropped_input(SkCanvas* canvas, skiatest::Reporter* re
     bitmap.eraseARGB(255, 255, 255, 255);
 
     sk_sp<SkColorFilter> green(SkColorFilter::MakeModeFilter(SK_ColorGREEN,
-                                                             SkXfermode::kSrcIn_Mode));
+                                                             SkBlendMode::kSrcIn));
     sk_sp<SkImageFilter> greenFilter(SkColorFilterImageFilter::Make(green, nullptr));
     SkImageFilter::CropRect cropRect(SkRect::MakeEmpty());
     sk_sp<SkImageFilter> croppedOut(SkColorFilterImageFilter::Make(green, nullptr, &cropRect));
@@ -1848,7 +1848,7 @@ DEF_GPUTEST_FOR_ALL_CONTEXTS(ImageFilterBlurLargeImage_Gpu, reporter, ctxInfo) {
  */
 DEF_TEST(ImageFilterComplexCTM, reporter) {
     // just need a colorfilter to exercise the corresponding imagefilter
-    sk_sp<SkColorFilter> cf = SkColorFilter::MakeModeFilter(SK_ColorRED, SkXfermode::kSrcATop_Mode);
+    sk_sp<SkColorFilter> cf = SkColorFilter::MakeModeFilter(SK_ColorRED, SkBlendMode::kSrcATop);
     sk_sp<SkImageFilter> cfif = SkColorFilterImageFilter::Make(cf, nullptr);    // can handle
     sk_sp<SkImageFilter> blif = SkBlurImageFilter::Make(3, 3, nullptr);         // cannot handle
 
@@ -1858,13 +1858,13 @@ DEF_TEST(ImageFilterComplexCTM, reporter) {
     } recs[] = {
         { cfif,                                     true  },
         { SkColorFilterImageFilter::Make(cf, cfif), true  },
-        { SkMergeImageFilter::Make(cfif, cfif),     true  },
+        { SkMergeImageFilter::Make(cfif, cfif, SkBlendMode::kSrcOver),     true  },
         { SkComposeImageFilter::Make(cfif, cfif),   true  },
 
         { blif,                                     false },
         { SkBlurImageFilter::Make(3, 3, cfif),      false },
         { SkColorFilterImageFilter::Make(cf, blif), false },
-        { SkMergeImageFilter::Make(cfif, blif),     false },
+        { SkMergeImageFilter::Make(cfif, blif, SkBlendMode::kSrcOver),     false },
         { SkComposeImageFilter::Make(blif, cfif),   false },
     };
     
index a7f846c..073f667 100644 (file)
@@ -129,7 +129,7 @@ DEF_GPUTEST_FOR_GL_RENDERING_CONTEXTS(SRGBMipMaps, reporter, ctxInfo) {
     SkRect rect = SkRect::MakeWH(SkIntToScalar(rtS), SkIntToScalar(rtS));
     GrNoClip noClip;
     GrPaint paint;
-    paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode);
+    paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
     GrTextureParams mipMapParams(SkShader::kRepeat_TileMode, GrTextureParams::kMipMap_FilterMode);
     paint.addColorTextureProcessor(texture, nullptr, SkMatrix::MakeScale(0.5f), mipMapParams);
 
index 324ea4b..db3b5ea 100644 (file)
@@ -254,7 +254,7 @@ static void test_path(GrRenderTargetContext* renderTargetContext, GrResourceProv
     GrTessellatingPathRenderer tess;
 
     GrPaint paint;
-    paint.setXPFactory(GrPorterDuffXPFactory::Make(SkXfermode::kSrc_Mode));
+    paint.setXPFactory(GrPorterDuffXPFactory::Make(SkBlendMode::kSrc));
 
     GrNoClip noClip;
     GrStyle style(SkStrokeRec::kFill_InitStyle);
index ee3427d..8bdaca1 100644 (file)
@@ -654,17 +654,27 @@ void SkDebugCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar
 }
 
 void SkDebugCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
-                                const SkPoint texCoords[4], SkXfermode* xmode,
+                                const SkPoint texCoords[4], SK_XFERMODE_PARAM xmode,
                                 const SkPaint& paint) {
-    this->addDrawCommand(new SkDrawPatchCommand(cubics, colors, texCoords, xmode, paint));
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_PARAM
+    SkBlendMode bmode = xmode ? xmode->blend() : SkBlendMode::kModulate;
+#else
+    SkBlendMode bmode = xmode;
+#endif
+    this->addDrawCommand(new SkDrawPatchCommand(cubics, colors, texCoords, bmode, paint));
 }
 
 void SkDebugCanvas::onDrawVertices(VertexMode vmode, int vertexCount, const SkPoint vertices[],
                                    const SkPoint texs[], const SkColor colors[],
-                                   SkXfermode*, const uint16_t indices[], int indexCount,
+                                   SK_XFERMODE_PARAM xmode, const uint16_t indices[], int indexCount,
                                    const SkPaint& paint) {
+#ifdef SK_SUPPORT_LEGACY_XFERMODE_PARAM
+    SkBlendMode bmode = xmode ? xmode->blend() : SkBlendMode::kModulate;
+#else
+    SkBlendMode bmode = xmode;
+#endif
     this->addDrawCommand(new SkDrawVerticesCommand(vmode, vertexCount, vertices,
-                         texs, colors, nullptr, indices, indexCount, paint));
+                         texs, colors, bmode, indices, indexCount, paint));
 }
 
 void SkDebugCanvas::willRestore() {
index 42b6a09..b7d7f79 100644 (file)
@@ -226,7 +226,7 @@ protected:
                         const SkPaint& paint) override;
 
     void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
-                     const SkPoint texCoords[4], SkXfermode* xmode, const SkPaint& paint) override;
+                     const SkPoint texCoords[4], SK_XFERMODE_PARAM, const SkPaint& paint) override;
     void onDrawPaint(const SkPaint&) override;
 
     void onDrawRect(const SkRect&, const SkPaint&) override;
@@ -236,7 +236,7 @@ protected:
     void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&) override;
     void onDrawVertices(VertexMode vmode, int vertexCount,
                         const SkPoint vertices[], const SkPoint texs[],
-                        const SkColor colors[], SkXfermode* xmode,
+                        const SkColor colors[], SK_XFERMODE_PARAM,
                         const uint16_t indices[], int indexCount,
                         const SkPaint&) override;
     void onDrawPath(const SkPath&, const SkPaint&) override;
index 3c2f051..1f0fdf7 100644 (file)
@@ -2941,9 +2941,11 @@ SkDrawTextBlobCommand* SkDrawTextBlobCommand::fromJSON(Json::Value& command,
 }
 
 SkDrawPatchCommand::SkDrawPatchCommand(const SkPoint cubics[12], const SkColor colors[4],
-                                       const SkPoint texCoords[4], SkXfermode* xfermode,
+                                       const SkPoint texCoords[4], SkBlendMode bmode,
                                        const SkPaint& paint)
-    : INHERITED(kDrawPatch_OpType) {
+    : INHERITED(kDrawPatch_OpType)
+    , fBlendMode(bmode)
+{
     memcpy(fCubics, cubics, sizeof(fCubics));
     if (colors != nullptr) {
         memcpy(fColors, colors, sizeof(fColors));
@@ -2957,16 +2959,13 @@ SkDrawPatchCommand::SkDrawPatchCommand(const SkPoint cubics[12], const SkColor c
     } else {
         fTexCoordsPtr = nullptr;
     }
-    if (xfermode != nullptr) {
-        fXfermode.reset(SkRef(xfermode));
-    }
     fPaint = paint;
 
     fInfo.push(SkObjectParser::PaintToString(paint));
 }
 
 void SkDrawPatchCommand::execute(SkCanvas* canvas) const {
-    canvas->drawPatch(fCubics, fColorsPtr, fTexCoordsPtr, fXfermode, fPaint);
+    canvas->drawPatch(fCubics, fColorsPtr, fTexCoordsPtr, fBlendMode, fPaint);
 }
 
 Json::Value SkDrawPatchCommand::toJSON(UrlDataManager& urlDataManager) const {
@@ -2990,11 +2989,7 @@ Json::Value SkDrawPatchCommand::toJSON(UrlDataManager& urlDataManager) const {
         }
         result[SKDEBUGCANVAS_ATTRIBUTE_TEXTURECOORDS] = texCoords;
     }
-    if (fXfermode.get() != nullptr) {
-        Json::Value jsonXfermode;
-        flatten(fXfermode, &jsonXfermode, urlDataManager);
-        result[SKDEBUGCANVAS_ATTRIBUTE_XFERMODE] = jsonXfermode;
-    }
+    // fBlendMode
     return result;
 }
 
@@ -3029,14 +3024,12 @@ SkDrawPatchCommand* SkDrawPatchCommand::fromJSON(Json::Value& command,
     else {
         texCoordsPtr = nullptr;
     }
-    SkAutoTUnref<SkXfermode> xfermode;
-    if (command.isMember(SKDEBUGCANVAS_ATTRIBUTE_XFERMODE)) {
-        Json::Value jsonXfermode = command[SKDEBUGCANVAS_ATTRIBUTE_XFERMODE];
-        xfermode.reset((SkXfermode*) load_flattenable(jsonXfermode, urlDataManager));
-    }
+
+    SkBlendMode bmode = SkBlendMode::kSrcOver; // TODO: extract from json
+
     SkPaint paint;
     extract_json_paint(command[SKDEBUGCANVAS_ATTRIBUTE_PAINT], urlDataManager, &paint);
-    return new SkDrawPatchCommand(cubics, colorsPtr, texCoordsPtr, xfermode, paint);
+    return new SkDrawPatchCommand(cubics, colorsPtr, texCoordsPtr, bmode, paint);
 }
 
 SkDrawRectCommand::SkDrawRectCommand(const SkRect& rect, const SkPaint& paint)
@@ -3308,10 +3301,12 @@ SkDrawTextRSXformCommand* SkDrawTextRSXformCommand::fromJSON(Json::Value& comman
 
 SkDrawVerticesCommand::SkDrawVerticesCommand(SkCanvas::VertexMode vmode, int vertexCount,
                                              const SkPoint vertices[], const SkPoint texs[],
-                                             const SkColor colors[], SkXfermode* xfermode,
+                                             const SkColor colors[], SkBlendMode bmode,
                                              const uint16_t indices[], int indexCount,
                                              const SkPaint& paint)
-    : INHERITED(kDrawVertices_OpType) {
+    : INHERITED(kDrawVertices_OpType)
+    , fBlendMode(bmode)
+{
     fVmode = vmode;
 
     fVertexCount = vertexCount;
@@ -3333,11 +3328,6 @@ SkDrawVerticesCommand::SkDrawVerticesCommand(SkCanvas::VertexMode vmode, int ver
         fColors = nullptr;
     }
 
-    fXfermode = xfermode;
-    if (fXfermode) {
-        fXfermode->ref();
-    }
-
     if (indexCount > 0) {
         fIndices = new uint16_t[indexCount];
         memcpy(fIndices, indices, indexCount * sizeof(uint16_t));
@@ -3357,13 +3347,12 @@ SkDrawVerticesCommand::~SkDrawVerticesCommand() {
     delete [] fVertices;
     delete [] fTexs;
     delete [] fColors;
-    SkSafeUnref(fXfermode);
     delete [] fIndices;
 }
 
 void SkDrawVerticesCommand::execute(SkCanvas* canvas) const {
     canvas->drawVertices(fVmode, fVertexCount, fVertices,
-                         fTexs, fColors, fXfermode, fIndices,
+                         fTexs, fColors, fBlendMode, fIndices,
                          fIndexCount, fPaint);
 }
 
index 8d30960..54ee3c6 100644 (file)
@@ -643,7 +643,7 @@ private:
 class SkDrawPatchCommand : public SkDrawCommand {
 public:
     SkDrawPatchCommand(const SkPoint cubics[12], const SkColor colors[4],
-                       const SkPoint texCoords[4], SkXfermode* xmode,
+                       const SkPoint texCoords[4], SkBlendMode bmode,
                        const SkPaint& paint);
     void execute(SkCanvas* canvas) const override;
     Json::Value toJSON(UrlDataManager& urlDataManager) const override;
@@ -655,7 +655,7 @@ private:
     SkColor  fColors[4];
     SkPoint* fTexCoordsPtr;
     SkPoint  fTexCoords[4];
-    SkAutoTUnref<SkXfermode> fXfermode;
+    SkBlendMode fBlendMode;
     SkPaint fPaint;
 
     typedef SkDrawCommand INHERITED;
@@ -714,7 +714,7 @@ class SkDrawVerticesCommand : public SkDrawCommand {
 public:
     SkDrawVerticesCommand(SkCanvas::VertexMode vmode, int vertexCount,
                           const SkPoint vertices[], const SkPoint texs[],
-                          const SkColor colors[], SkXfermode* xfermode,
+                          const SkColor colors[], SkBlendMode,
                           const uint16_t indices[], int indexCount,
                           const SkPaint& paint);
     virtual ~SkDrawVerticesCommand();
@@ -726,7 +726,7 @@ private:
     SkPoint*    fVertices;
     SkPoint*    fTexs;
     SkColor*    fColors;
-    SkXfermode* fXfermode;
+    SkBlendMode fBlendMode;
     uint16_t*   fIndices;
     int         fIndexCount;
     SkPaint     fPaint;