• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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,
24     };
25 
SkHighContrastConfigSkHighContrastConfig26     SkHighContrastConfig() {
27         fGrayscale = false;
28         fInvertStyle = InvertStyle::kNoInvert;
29         fContrast = 0.0f;
30     }
31 
SkHighContrastConfigSkHighContrastConfig32     SkHighContrastConfig(bool grayscale,
33                          InvertStyle invertStyle,
34                          SkScalar contrast)
35         : fGrayscale(grayscale),
36           fInvertStyle(invertStyle),
37           fContrast(contrast) {}
38 
39     // Returns true if all of the fields are set within the valid range.
isValidSkHighContrastConfig40     bool isValid() const {
41         return fInvertStyle >= InvertStyle::kNoInvert &&
42             fInvertStyle <= InvertStyle::kInvertLightness &&
43             fContrast >= -1.0 &&
44             fContrast <= 1.0;
45     }
46 
47     // If true, the color will be converted to grayscale.
48     bool fGrayscale;
49 
50     // Whether to invert brightness, lightness, or neither.
51     InvertStyle fInvertStyle;
52 
53     // After grayscale and inverting, the contrast can be adjusted linearly.
54     // The valid range is -1.0 through 1.0, where 0.0 is no adjustment.
55     SkScalar  fContrast;
56 };
57 
58 /**
59  *  Color filter that provides transformations to improve contrast
60  *  for users with low vision.
61  *
62  *  Applies the following transformations in this order. Each of these
63  *  can be configured using SkHighContrastConfig.
64  *
65  *    - Conversion to grayscale
66  *    - Color inversion (either in RGB or HSL space)
67  *    - Increasing the resulting contrast.
68  *
69  * Calling SkHighContrastFilter::Make will return nullptr if the config is
70  * not valid, e.g. if you try to call it with a contrast outside the range of
71  * -1.0 to 1.0.
72  */
73 class SK_API SkHighContrastFilter {
74 public:
75     // Returns the filter, or nullptr if the config is invalid.
76     static sk_sp<SkColorFilter> Make(const SkHighContrastConfig& config);
77 
78     SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP()
79 };
80 
81 #endif
82