Skia
2D Graphics Library
SkSamplingOptions.h
Go to the documentation of this file.
1 /*
2  * Copyright 2020 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef SkImageSampling_DEFINED
9 #define SkImageSampling_DEFINED
10 
11 #include "include/core/SkTypes.h"
12 
13 #include <algorithm>
14 #include <new>
15 
16 enum class SkFilterMode {
17  kNearest, // single sample point (nearest neighbor)
18  kLinear, // interporate between 2x2 sample points (bilinear interpolation)
19 
20  kLast = kLinear,
21 };
22 static constexpr int kSkFilterModeCount = static_cast<int>(SkFilterMode::kLast) + 1;
23 
24 enum class SkMipmapMode {
25  kNone, // ignore mipmap levels, sample from the "base"
26  kNearest, // sample from the nearest level
27  kLinear, // interpolate between the two nearest levels
28 
29  kLast = kLinear,
30 };
31 static constexpr int kSkMipmapModeCount = static_cast<int>(SkMipmapMode::kLast) + 1;
32 
33 /*
34  * Specify B and C (each between 0...1) to create a shader that applies the corresponding
35  * cubic reconstruction filter to the image.
36  *
37  * Example values:
38  * B = 1/3, C = 1/3 "Mitchell" filter
39  * B = 0, C = 1/2 "Catmull-Rom" filter
40  *
41  * See "Reconstruction Filters in Computer Graphics"
42  * Don P. Mitchell
43  * Arun N. Netravali
44  * 1988
45  * https://www.cs.utexas.edu/~fussell/courses/cs384g-fall2013/lectures/mitchell/Mitchell.pdf
46  *
47  * Desmos worksheet https://www.desmos.com/calculator/aghdpicrvr
48  * Nice overview https://entropymine.com/imageworsener/bicubic/
49  */
51  float B, C;
52 
53  // Historic default for kHigh_SkFilterQuality
54  static constexpr SkCubicResampler Mitchell() { return {1/3.0f, 1/3.0f}; }
55  static constexpr SkCubicResampler CatmullRom() { return {0.0f, 1/2.0f}; }
56 };
57 
58 struct SK_API SkSamplingOptions {
59  const int maxAniso = 0;
60  const bool useCubic = false;
61  const SkCubicResampler cubic = {0, 0};
64 
65  constexpr SkSamplingOptions() = default;
68  this->~SkSamplingOptions(); // A pedantic no-op.
69  new (this) SkSamplingOptions(that);
70  return *this;
71  }
72 
74  : filter(fm)
75  , mipmap(mm) {}
76 
77  // These are intentionally implicit because the single parameter clearly conveys what the
78  // implicitly created SkSamplingOptions will be.
80  : filter(fm)
81  , mipmap(SkMipmapMode::kNone) {}
82 
83  constexpr SkSamplingOptions(const SkCubicResampler& c)
84  : useCubic(true)
85  , cubic(c) {}
86 
87  static constexpr SkSamplingOptions Aniso(int maxAniso) {
88  return SkSamplingOptions{std::max(maxAniso, 1)};
89  }
90 
91  bool operator==(const SkSamplingOptions& other) const {
92  return maxAniso == other.maxAniso
93  && useCubic == other.useCubic
94  && cubic.B == other.cubic.B
95  && cubic.C == other.cubic.C
96  && filter == other.filter
97  && mipmap == other.mipmap;
98  }
99  bool operator!=(const SkSamplingOptions& other) const { return !(*this == other); }
100 
101  bool isAniso() const { return maxAniso != 0; }
102 
103 private:
104  constexpr SkSamplingOptions(int maxAniso) : maxAniso(maxAniso) {}
105 };
106 
107 #endif
@ kNone
glyph outlines unchanged
SkFilterMode
Definition: SkSamplingOptions.h:16
SkMipmapMode
Definition: SkSamplingOptions.h:24
static constexpr int kSkFilterModeCount
Definition: SkSamplingOptions.h:22
static constexpr int kSkMipmapModeCount
Definition: SkSamplingOptions.h:31
Definition: SkSamplingOptions.h:50
static constexpr SkCubicResampler CatmullRom()
Definition: SkSamplingOptions.h:55
float C
Definition: SkSamplingOptions.h:51
float B
Definition: SkSamplingOptions.h:51
static constexpr SkCubicResampler Mitchell()
Definition: SkSamplingOptions.h:54
Definition: SkSamplingOptions.h:58
constexpr SkSamplingOptions(SkFilterMode fm, SkMipmapMode mm)
Definition: SkSamplingOptions.h:73
bool operator==(const SkSamplingOptions &other) const
Definition: SkSamplingOptions.h:91
bool isAniso() const
Definition: SkSamplingOptions.h:101
static constexpr SkSamplingOptions Aniso(int maxAniso)
Definition: SkSamplingOptions.h:87
constexpr SkSamplingOptions(const SkCubicResampler &c)
Definition: SkSamplingOptions.h:83
const SkCubicResampler cubic
Definition: SkSamplingOptions.h:61
constexpr SkSamplingOptions()=default
bool operator!=(const SkSamplingOptions &other) const
Definition: SkSamplingOptions.h:99
const SkFilterMode filter
Definition: SkSamplingOptions.h:62
SkSamplingOptions(const SkSamplingOptions &)=default
SkSamplingOptions & operator=(const SkSamplingOptions &that)
Definition: SkSamplingOptions.h:67
constexpr SkSamplingOptions(SkFilterMode fm)
Definition: SkSamplingOptions.h:79
const SkMipmapMode mipmap
Definition: SkSamplingOptions.h:63
const bool useCubic
Definition: SkSamplingOptions.h:60
const int maxAniso
Definition: SkSamplingOptions.h:59