Dominic Mazzoni | 394d414 | 2017-02-14 11:15:31 -0800 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2017 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 SkHighContrastFilter_DEFINED |
| 9 | #define SkHighContrastFilter_DEFINED |
| 10 | |
| 11 | #include "SkColorFilter.h" |
| 12 | #include "SkPaint.h" |
| 13 | |
| 14 | /** |
| 15 | * Configuration struct for SkHighContrastFilter. |
| 16 | * |
| 17 | * Provides transformations to improve contrast for users with low vision. |
| 18 | */ |
| 19 | struct SkHighContrastConfig { |
| 20 | enum class InvertStyle { |
| 21 | kNoInvert, |
| 22 | kInvertBrightness, |
| 23 | kInvertLightness, |
Robert Phillips | a83d013 | 2018-01-24 14:46:38 -0500 | [diff] [blame] | 24 | |
| 25 | kLast = kInvertLightness |
Dominic Mazzoni | 394d414 | 2017-02-14 11:15:31 -0800 | [diff] [blame] | 26 | }; |
| 27 | |
| 28 | SkHighContrastConfig() { |
| 29 | fGrayscale = false; |
| 30 | fInvertStyle = InvertStyle::kNoInvert; |
| 31 | fContrast = 0.0f; |
| 32 | } |
| 33 | |
| 34 | SkHighContrastConfig(bool grayscale, |
| 35 | InvertStyle invertStyle, |
| 36 | SkScalar contrast) |
| 37 | : fGrayscale(grayscale), |
| 38 | fInvertStyle(invertStyle), |
| 39 | fContrast(contrast) {} |
| 40 | |
| 41 | // Returns true if all of the fields are set within the valid range. |
| 42 | bool isValid() const { |
| 43 | return fInvertStyle >= InvertStyle::kNoInvert && |
| 44 | fInvertStyle <= InvertStyle::kInvertLightness && |
| 45 | fContrast >= -1.0 && |
| 46 | fContrast <= 1.0; |
| 47 | } |
| 48 | |
| 49 | // If true, the color will be converted to grayscale. |
| 50 | bool fGrayscale; |
| 51 | |
| 52 | // Whether to invert brightness, lightness, or neither. |
| 53 | InvertStyle fInvertStyle; |
| 54 | |
| 55 | // After grayscale and inverting, the contrast can be adjusted linearly. |
| 56 | // The valid range is -1.0 through 1.0, where 0.0 is no adjustment. |
| 57 | SkScalar fContrast; |
| 58 | }; |
| 59 | |
| 60 | /** |
| 61 | * Color filter that provides transformations to improve contrast |
| 62 | * for users with low vision. |
| 63 | * |
| 64 | * Applies the following transformations in this order. Each of these |
| 65 | * can be configured using SkHighContrastConfig. |
| 66 | * |
| 67 | * - Conversion to grayscale |
| 68 | * - Color inversion (either in RGB or HSL space) |
| 69 | * - Increasing the resulting contrast. |
| 70 | * |
| 71 | * Calling SkHighContrastFilter::Make will return nullptr if the config is |
| 72 | * not valid, e.g. if you try to call it with a contrast outside the range of |
| 73 | * -1.0 to 1.0. |
| 74 | */ |
Cary Clark | 4dc5a45 | 2018-05-21 11:56:57 -0400 | [diff] [blame] | 75 | |
Dominic Mazzoni | 394d414 | 2017-02-14 11:15:31 -0800 | [diff] [blame] | 76 | class SK_API SkHighContrastFilter { |
| 77 | public: |
| 78 | // Returns the filter, or nullptr if the config is invalid. |
| 79 | static sk_sp<SkColorFilter> Make(const SkHighContrastConfig& config); |
| 80 | |
Cary Clark | 4dc5a45 | 2018-05-21 11:56:57 -0400 | [diff] [blame] | 81 | static void InitializeFlattenables(); |
Dominic Mazzoni | 394d414 | 2017-02-14 11:15:31 -0800 | [diff] [blame] | 82 | }; |
| 83 | |
| 84 | #endif |