other ways to organize samplingoptions?

do not land

Change-Id: I5fa7b2a0d1eb7e893d9b333f850a2f515d7ce065
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/336956
Commit-Queue: Mike Reed <reed@google.com>
Reviewed-by: Mike Klein <mtklein@google.com>
diff --git a/bench/FilteringBench.cpp b/bench/FilteringBench.cpp
index 52ba266..fa4eb50 100644
--- a/bench/FilteringBench.cpp
+++ b/bench/FilteringBench.cpp
@@ -14,9 +14,8 @@
 
 class FilteringBench : public Benchmark {
 public:
-    FilteringBench(SkFilterOptions options) : fOptions(options) {
-        fName.printf("filteroptions_sampling_%d_mipmap_%d",
-                     (int)options.fSampling, (int)options.fMipmap);
+    FilteringBench(SkFilterMode fm, SkMipmapMode mm) : fSampling(fm, mm) {
+        fName.printf("samplingoptions_filter_%d_mipmap_%d", (int)fm, (int)mm);
     }
 
 protected:
@@ -30,7 +29,7 @@
         img = img->makeRasterImage();
 
         fRect = SkRect::MakeIWH(img->width(), img->height());
-        fShader = img->makeShader(SkTileMode::kClamp, SkTileMode::kClamp, fOptions);
+        fShader = img->makeShader(SkTileMode::kClamp, SkTileMode::kClamp, fSampling);
     }
 
     void onDraw(int loops, SkCanvas* canvas) override {
@@ -50,15 +49,15 @@
     SkString        fName;
     SkRect          fRect;
     sk_sp<SkShader> fShader;
-    SkFilterOptions fOptions;
+    SkSamplingOptions fSampling;
 
     using INHERITED = Benchmark;
 };
 
-DEF_BENCH( return new FilteringBench({SkSamplingMode::kLinear,  SkMipmapMode::kLinear}); )
-DEF_BENCH( return new FilteringBench({SkSamplingMode::kLinear,  SkMipmapMode::kNearest}); )
-DEF_BENCH( return new FilteringBench({SkSamplingMode::kLinear,  SkMipmapMode::kNone}); )
+DEF_BENCH( return new FilteringBench(SkFilterMode::kLinear,  SkMipmapMode::kLinear); )
+DEF_BENCH( return new FilteringBench(SkFilterMode::kLinear,  SkMipmapMode::kNearest); )
+DEF_BENCH( return new FilteringBench(SkFilterMode::kLinear,  SkMipmapMode::kNone); )
 
-DEF_BENCH( return new FilteringBench({SkSamplingMode::kNearest, SkMipmapMode::kLinear}); )
-DEF_BENCH( return new FilteringBench({SkSamplingMode::kNearest, SkMipmapMode::kNearest}); )
-DEF_BENCH( return new FilteringBench({SkSamplingMode::kNearest, SkMipmapMode::kNone}); )
+DEF_BENCH( return new FilteringBench(SkFilterMode::kNearest, SkMipmapMode::kLinear); )
+DEF_BENCH( return new FilteringBench(SkFilterMode::kNearest, SkMipmapMode::kNearest); )
+DEF_BENCH( return new FilteringBench(SkFilterMode::kNearest, SkMipmapMode::kNone); )
diff --git a/gm/bicubic.cpp b/gm/bicubic.cpp
index 2571920..af19914 100644
--- a/gm/bicubic.cpp
+++ b/gm/bicubic.cpp
@@ -40,7 +40,8 @@
         { 1.0f/3, 1.0f/3 },
     };
     for (auto c : cubics) {
-        paint.setShader(img->makeShader(SkTileMode::kClamp, SkTileMode::kClamp, c));
+        paint.setShader(img->makeShader(SkTileMode::kClamp, SkTileMode::kClamp,
+                                        SkSamplingOptions(c)));
         canvas->drawRect(r, paint);
         canvas->translate(0, img->height() + 1.0f);
     }
diff --git a/gm/showmiplevels.cpp b/gm/showmiplevels.cpp
index 169e3cb..ded9333 100644
--- a/gm/showmiplevels.cpp
+++ b/gm/showmiplevels.cpp
@@ -346,15 +346,15 @@
 
         canvas->translate(10, 10);
         for (auto mm : {SkMipmapMode::kNone, SkMipmapMode::kNearest, SkMipmapMode::kLinear}) {
-            for (auto sa : {SkSamplingMode::kNearest, SkSamplingMode::kLinear}) {
-                canvas->translate(0, draw_downscaling(canvas, {sa, mm}));
+            for (auto fm : {SkFilterMode::kNearest, SkFilterMode::kLinear}) {
+                canvas->translate(0, draw_downscaling(canvas, {fm, mm}));
             }
         }
         return DrawResult::kOk;
     }
 
 private:
-    SkScalar draw_downscaling(SkCanvas* canvas, SkFilterOptions options) {
+    SkScalar draw_downscaling(SkCanvas* canvas, SkSamplingOptions sampling) {
         SkAutoCanvasRestore acr(canvas, true);
 
         SkPaint paint;
@@ -362,7 +362,7 @@
         for (float scale = 1; scale >= 0.1f; scale *= 0.7f) {
             SkMatrix matrix = SkMatrix::Scale(scale, scale);
             paint.setShader(fImg->makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat,
-                                             options, &matrix));
+                                             sampling, &matrix));
             canvas->drawRect(r, paint);
             canvas->translate(r.width() + 10, 0);
         }
diff --git a/include/core/SkImage.h b/include/core/SkImage.h
index 41a25a6..9cf2141 100644
--- a/include/core/SkImage.h
+++ b/include/core/SkImage.h
@@ -20,6 +20,13 @@
 #include "include/gpu/GrTypes.h"
 #include <functional>  // std::function
 
+// DEPRECATED -- use SkSamplingOptions
+enum class SkSamplingMode { kNearest, kLinear };
+struct SkFilterOptions {
+    SkSamplingMode  fSampling;
+    SkMipmapMode    fMipmap;
+};
+
 #if defined(SK_BUILD_FOR_ANDROID) && __ANDROID_API__ >= 26
 #include <android/hardware_buffer.h>
 #endif
@@ -718,6 +725,8 @@
         return this->makeShader(SkTileMode::kClamp, SkTileMode::kClamp, &localMatrix);
     }
 
+    // DEPRECATED -- use SkSamplingOptions
+    sk_sp<SkShader> makeShader(SkTileMode tmx, SkTileMode tmy, const SkFilterOptions&) const;
 
     /** Copies SkImage pixel address, row bytes, and SkImageInfo to pixmap, if address
         is available, and returns true. If pixel address is not available, return
diff --git a/include/core/SkSamplingOptions.h b/include/core/SkSamplingOptions.h
index 2f9b55e..0ddb8e5 100644
--- a/include/core/SkSamplingOptions.h
+++ b/include/core/SkSamplingOptions.h
@@ -10,7 +10,7 @@
 
 #include "include/core/SkFilterQuality.h"
 
-enum class SkSamplingMode {
+enum class SkFilterMode {
     kNearest,   // single sample point (nearest neighbor)
     kLinear,    // interporate between 2x2 sample points (bilinear interpolation)
 };
@@ -42,36 +42,24 @@
     float B, C;
 };
 
-struct SkFilterOptions {
-    SkSamplingMode  fSampling;
-    SkMipmapMode    fMipmap;
-};
-
 struct SkSamplingOptions {
-    bool             fUseCubic;
-    SkCubicResampler fCubic;     //!< use if fUseCubic is true
-    SkFilterOptions  fFilter;    //!< use if fUseCubic is false
+    bool             fUseCubic = false;
+    SkCubicResampler fCubic    = {0, 0};
+    SkFilterMode     fFilter   = SkFilterMode::kNearest;
+    SkMipmapMode     fMipmap   = SkMipmapMode::kNone;
 
-    SkSamplingOptions()
+    SkSamplingOptions() = default;
+
+    SkSamplingOptions(SkFilterMode fm, SkMipmapMode mm)
         : fUseCubic(false)
-        , fCubic({0,0})
-        , fFilter({SkSamplingMode::kNearest, SkMipmapMode::kNone})
-    {}
+        , fFilter(fm)
+        , fMipmap(mm) {}
 
-    SkSamplingOptions(const SkFilterOptions& filter)
-        : fUseCubic(false)
-        , fCubic({0,0})     // ignored
-        , fFilter(filter)
-    {}
-
-    SkSamplingOptions(const SkCubicResampler& cubic)
+    explicit SkSamplingOptions(const SkCubicResampler& cubic)
         : fUseCubic(true)
-        , fCubic(cubic)
-        , fFilter({SkSamplingMode::kNearest, SkMipmapMode::kNone})  // ignored
-    {}
+        , fCubic(cubic) {}
 
-    // Soon to go away
-    static SkSamplingOptions Make(SkFilterQuality);
+    explicit SkSamplingOptions(SkFilterQuality);
 };
 
 #endif
diff --git a/samplecode/SampleXfer.cpp b/samplecode/SampleXfer.cpp
index 8a2c66b..23789fd 100644
--- a/samplecode/SampleXfer.cpp
+++ b/samplecode/SampleXfer.cpp
@@ -219,15 +219,16 @@
             lm.postTranslate(r.width() + 10, 0);
 
             paint.setShader(fImage->makeShader(SkTileMode::kClamp, SkTileMode::kClamp,
-                                               SkFilterOptions{ SkSamplingMode::kLinear,
-                                                                SkMipmapMode::kNone },
+                                               SkSamplingOptions{ SkFilterMode::kLinear,
+                                                                  SkMipmapMode::kNone },
                                                &lm));
             canvas->drawRect(r, paint);
 
             r.offset(r.width() + 10, 0);
             lm.postTranslate(r.width() + 10, 0);
 
-            paint.setShader(fImage->makeShader(SkTileMode::kClamp, SkTileMode::kClamp, cubic, &lm));
+            paint.setShader(fImage->makeShader(SkTileMode::kClamp, SkTileMode::kClamp,
+                                               SkSamplingOptions(cubic), &lm));
             canvas->drawRect(r, paint);
         }
     };
diff --git a/src/core/SkPixmap.cpp b/src/core/SkPixmap.cpp
index cf6ddba..cf51dc6 100644
--- a/src/core/SkPixmap.cpp
+++ b/src/core/SkPixmap.cpp
@@ -239,7 +239,7 @@
                                               SkMatrix::kFill_ScaleToFit);
 
     // We'll create a shader to do this draw so we have control over the bicubic clamp.
-    SkSamplingOptions sampling = SkSamplingOptions::Make(quality);
+    auto sampling = SkSamplingOptions(quality);
     sk_sp<SkShader> shader = SkImageShader::Make(SkImage::MakeFromBitmap(bitmap),
                                                  SkTileMode::kClamp,
                                                  SkTileMode::kClamp,
diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp
index 90ffa53..798d0ca 100644
--- a/src/image/SkImage.cpp
+++ b/src/image/SkImage.cpp
@@ -150,11 +150,18 @@
 
 sk_sp<SkShader> SkImage::makeShader(SkTileMode tmx, SkTileMode tmy,
                                     const SkMatrix* localMatrix, SkFilterQuality filtering) const {
-    SkSamplingOptions sampling = SkSamplingOptions::Make(filtering);
+    auto sampling = SkSamplingOptions(filtering);
     return SkImageShader::Make(sk_ref_sp(const_cast<SkImage*>(this)), tmx, tmy, &sampling,
                                localMatrix);
 }
 
+// DEPRECATED
+sk_sp<SkShader> SkImage::makeShader(SkTileMode tmx, SkTileMode tmy,
+                                    const SkFilterOptions& options) const {
+    return this->makeShader(tmx, tmy, SkSamplingOptions((SkFilterMode)options.fSampling,
+                                                        options.fMipmap));
+}
+
 sk_sp<SkData> SkImage::encodeToData(SkEncodedImageFormat type, int quality) const {
     // Context TODO: Elevate GrDirectContext requirement to public API.
     auto dContext = as_IB(this)->directContext();
@@ -636,22 +643,26 @@
     return src->withMipmaps(fMM);
 }
 
-SkSamplingOptions SkSamplingOptions::Make(SkFilterQuality fq) {
+SkSamplingOptions::SkSamplingOptions(SkFilterQuality fq) {
     switch (fq) {
-        case SkFilterQuality::kLow_SkFilterQuality:
-            return SkSamplingOptions({
-                SkSamplingMode::kLinear,
-                SkMipmapMode::kNone
-            });
-        case SkFilterQuality::kMedium_SkFilterQuality:
-            return SkSamplingOptions({
-                SkSamplingMode::kLinear,
-                SkMipmapMode::kNearest
-            });
         case SkFilterQuality::kHigh_SkFilterQuality:
-            return SkSamplingOptions({1.0f/3, 1.0f/3});
+            fUseCubic = true;
+            fCubic = {1.0f/3, 1.0f/3};
+            break;
+        case SkFilterQuality::kMedium_SkFilterQuality:
+            fUseCubic = false;
+            fFilter = SkFilterMode::kLinear;
+            fMipmap = SkMipmapMode::kNearest;
+            break;
+        case SkFilterQuality::kLow_SkFilterQuality:
+            fUseCubic = false;
+            fFilter = SkFilterMode::kLinear;
+            fMipmap = SkMipmapMode::kNone;
+            break;
         case SkFilterQuality::kNone_SkFilterQuality:
-            break;  // fall out
+            fUseCubic = false;
+            fFilter = SkFilterMode::kNearest;
+            fMipmap = SkMipmapMode::kNone;
+            break;
     }
-    return SkSamplingOptions(); // kNone_SkFilterQuality
 }
diff --git a/src/shaders/SkImageShader.cpp b/src/shaders/SkImageShader.cpp
index 0c7565c..3dc11d1 100755
--- a/src/shaders/SkImageShader.cpp
+++ b/src/shaders/SkImageShader.cpp
@@ -107,15 +107,15 @@
     if (buffer.isVersionLT(SkPicturePriv::kCubicResamplerImageShader_Version)) {
         if (!buffer.isVersionLT(SkPicturePriv::kFilterOptionsInImageShader_Version)) {
             op.fUseCubic = false;
-            op.fFilter.fSampling = buffer.read32LE<SkSamplingMode>(SkSamplingMode::kLinear);
-            op.fFilter.fMipmap   = buffer.read32LE<SkMipmapMode>(SkMipmapMode::kLinear);
+            op.fFilter = buffer.read32LE<SkFilterMode>(SkFilterMode::kLinear);
+            op.fMipmap = buffer.read32LE<SkMipmapMode>(SkMipmapMode::kLinear);
         }
     } else {
         switch (fe) {
             case LegacyFilterEnum::kUseFilterOptions:
                 op.fUseCubic = false;
-                op.fFilter.fSampling = buffer.read32LE<SkSamplingMode>(SkSamplingMode::kLinear);
-                op.fFilter.fMipmap   = buffer.read32LE<SkMipmapMode>(SkMipmapMode::kLinear);
+                op.fFilter = buffer.read32LE<SkFilterMode>(SkFilterMode::kLinear);
+                op.fMipmap = buffer.read32LE<SkMipmapMode>(SkMipmapMode::kLinear);
                 break;
             case LegacyFilterEnum::kUseCubicResampler:
                 op.fUseCubic = true;
@@ -150,8 +150,8 @@
         buffer.writeScalar(sampling.fCubic.B);
         buffer.writeScalar(sampling.fCubic.C);
     } else {
-        buffer.writeUInt((unsigned)sampling.fFilter.fSampling);
-        buffer.writeUInt((unsigned)sampling.fFilter.fMipmap);
+        buffer.writeUInt((unsigned)sampling.fFilter);
+        buffer.writeUInt((unsigned)sampling.fMipmap);
     }
 }
 
@@ -162,8 +162,8 @@
         sampling.fCubic.B = buffer.readScalar();
         sampling.fCubic.C = buffer.readScalar();
     } else {
-        sampling.fFilter.fSampling = buffer.read32LE<SkSamplingMode>(SkSamplingMode::kLinear);
-        sampling.fFilter.fMipmap   = buffer.read32LE<SkMipmapMode>(SkMipmapMode::kLinear);
+        sampling.fFilter = buffer.read32LE<SkFilterMode>(SkFilterMode::kLinear);
+        sampling.fMipmap = buffer.read32LE<SkMipmapMode>(SkMipmapMode::kLinear);
     }
     return sampling;
 }
@@ -231,14 +231,14 @@
             q = kHigh_SkFilterQuality;
         }
     } else {
-        switch (sampling.fFilter.fMipmap) {
+        switch (sampling.fMipmap) {
             case SkMipmapMode::kNone:
-                q = sampling.fFilter.fSampling == SkSamplingMode::kLinear ?
+                q = sampling.fFilter == SkFilterMode::kLinear ?
                     kLow_SkFilterQuality :
                     kNone_SkFilterQuality;
                 break;
             case SkMipmapMode::kNearest:
-                if (sampling.fFilter.fSampling == SkSamplingMode::kLinear) {
+                if (sampling.fFilter == SkFilterMode::kLinear) {
                     q = kMedium_SkFilterQuality;
                 }
                 break;
@@ -455,11 +455,11 @@
         if (bicubic) {
             kernel = fSampling.fCubic;
         } else {
-            switch (fSampling.fFilter.fSampling) {
-                case SkSamplingMode::kNearest: fm = GrSamplerState::Filter::kNearest; break;
-                case SkSamplingMode::kLinear : fm = GrSamplerState::Filter::kLinear ; break;
+            switch (fSampling.fFilter) {
+                case SkFilterMode::kNearest: fm = GrSamplerState::Filter::kNearest; break;
+                case SkFilterMode::kLinear : fm = GrSamplerState::Filter::kLinear ; break;
             }
-            switch (fSampling.fFilter.fMipmap) {
+            switch (fSampling.fMipmap) {
                 case SkMipmapMode::kNone   : mm = GrSamplerState::MipmapMode::kNone   ; break;
                 case SkMipmapMode::kNearest: mm = GrSamplerState::MipmapMode::kNearest; break;
                 case SkMipmapMode::kLinear : mm = GrSamplerState::MipmapMode::kLinear ; break;
@@ -885,8 +885,8 @@
 }
 
 enum class SamplingEnum {
-    kNearest,
-    kLinear,
+    kNearest,   // matches SkFilterMode::kNearest
+    kLinear,    // matches SkFilterMode::kLinear
     kBicubic,
 };
 
@@ -906,7 +906,7 @@
                    *lower = nullptr;
     SkMatrix        upperInv;
     float           lowerWeight = 0;
-    SamplingEnum    sampling = (SamplingEnum)fSampling.fFilter.fSampling;
+    SamplingEnum    sampling = (SamplingEnum)fSampling.fFilter;
 
     auto post_scale = [&](SkISize level, const SkMatrix& base) {
         return SkMatrix::Scale(SkIntToScalar(level.width())  / fImage->width(),
@@ -924,7 +924,7 @@
             cubic = fSampling.fCubic;
         } else {
             auto* access = alloc->make<SkMipmapAccessor>(as_IB(fImage.get()), baseInv,
-                                                         fSampling.fFilter.fMipmap);
+                                                         fSampling.fMipmap);
             upper = &access->level();
             upperInv = post_scale(upper->dimensions(), baseInv);
             lowerWeight = access->lowerWeight();