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();