| 1 |  | 
| 2 | #pragma once | 
| 3 |  | 
| 4 | #include "Projection.h" | 
| 5 | #include "Shape.h" | 
| 6 | #include "BitmapRef.hpp" | 
| 7 |  | 
| 8 | namespace msdfgen { | 
| 9 |  | 
| 10 | /// Performs error correction on a computed MSDF to eliminate interpolation artifacts. This is a low-level class, you may want to use the API in msdf-error-correction.h instead. | 
| 11 | class MSDFErrorCorrection { | 
| 12 |  | 
| 13 | public: | 
| 14 |     /// Stencil flags. | 
| 15 |     enum Flags { | 
| 16 |         /// Texel marked as potentially causing interpolation errors. | 
| 17 |         ERROR = 1, | 
| 18 |         /// Texel marked as protected. Protected texels are only given the error flag if they cause inversion artifacts. | 
| 19 |         PROTECTED = 2 | 
| 20 |     }; | 
| 21 |  | 
| 22 |     MSDFErrorCorrection(); | 
| 23 |     explicit MSDFErrorCorrection(const BitmapRef<byte, 1> &stencil, const Projection &projection, double range); | 
| 24 |     /// Sets the minimum ratio between the actual and maximum expected distance delta to be considered an error. | 
| 25 |     void setMinDeviationRatio(double minDeviationRatio); | 
| 26 |     /// Sets the minimum ratio between the pre-correction distance error and the post-correction distance error. | 
| 27 |     void setMinImproveRatio(double minImproveRatio); | 
| 28 |     /// Flags all texels that are interpolated at corners as protected. | 
| 29 |     void protectCorners(const Shape &shape); | 
| 30 |     /// Flags all texels that contribute to edges as protected. | 
| 31 |     template <int N> | 
| 32 |     void protectEdges(const BitmapConstRef<float, N> &sdf); | 
| 33 |     /// Flags all texels as protected. | 
| 34 |     void protectAll(); | 
| 35 |     /// Flags texels that are expected to cause interpolation artifacts based on analysis of the SDF only. | 
| 36 |     template <int N> | 
| 37 |     void findErrors(const BitmapConstRef<float, N> &sdf); | 
| 38 |     /// Flags texels that are expected to cause interpolation artifacts based on analysis of the SDF and comparison with the exact shape distance. | 
| 39 |     template <template <typename> class ContourCombiner, int N> | 
| 40 |     void findErrors(const BitmapConstRef<float, N> &sdf, const Shape &shape); | 
| 41 |     /// Modifies the MSDF so that all texels with the error flag are converted to single-channel. | 
| 42 |     template <int N> | 
| 43 |     void apply(const BitmapRef<float, N> &sdf) const; | 
| 44 |     /// Returns the stencil in its current state (see Flags). | 
| 45 |     BitmapConstRef<byte, 1> getStencil() const; | 
| 46 |  | 
| 47 | private: | 
| 48 |     BitmapRef<byte, 1> stencil; | 
| 49 |     Projection projection; | 
| 50 |     double invRange; | 
| 51 |     double minDeviationRatio; | 
| 52 |     double minImproveRatio; | 
| 53 |  | 
| 54 | }; | 
| 55 |  | 
| 56 | } | 
| 57 |  |