| /* |
| * Copyright 2020 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef SkImageSampling_DEFINED |
| #define SkImageSampling_DEFINED |
| |
| #include "include/core/SkFilterQuality.h" |
| |
| enum class SkSamplingMode { |
| kNearest, // single sample point (nearest neighbor) |
| kLinear, // interporate between 2x2 sample points (bilinear interpolation) |
| }; |
| |
| enum class SkMipmapMode { |
| kNone, // ignore mipmap levels, sample from the "base" |
| kNearest, // sample from the nearest level |
| kLinear, // interpolate between the two nearest levels |
| }; |
| |
| /* |
| * Specify B and C (each between 0...1) to create a shader that applies the corresponding |
| * cubic reconstruction filter to the image. |
| * |
| * Example values: |
| * B = 1/3, C = 1/3 "Mitchell" filter |
| * B = 0, C = 1/2 "Catmull-Rom" filter |
| * |
| * See "Reconstruction Filters in Computer Graphics" |
| * Don P. Mitchell |
| * Arun N. Netravali |
| * 1988 |
| * https://www.cs.utexas.edu/~fussell/courses/cs384g-fall2013/lectures/mitchell/Mitchell.pdf |
| * |
| * Desmos worksheet https://www.desmos.com/calculator/aghdpicrvr |
| * Nice overview https://entropymine.com/imageworsener/bicubic/ |
| */ |
| struct SkCubicResampler { |
| 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 |
| |
| SkSamplingOptions() |
| : fUseCubic(false) |
| , fCubic({0,0}) |
| , fFilter({SkSamplingMode::kNearest, SkMipmapMode::kNone}) |
| {} |
| |
| SkSamplingOptions(const SkFilterOptions& filter) |
| : fUseCubic(false) |
| , fCubic({0,0}) // ignored |
| , fFilter(filter) |
| {} |
| |
| SkSamplingOptions(const SkCubicResampler& cubic) |
| : fUseCubic(true) |
| , fCubic(cubic) |
| , fFilter({SkSamplingMode::kNearest, SkMipmapMode::kNone}) // ignored |
| {} |
| |
| // Soon to go away |
| static SkSamplingOptions Make(SkFilterQuality); |
| }; |
| |
| #endif |