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 "include/core/SkColorFilter.h"
12#include "include/core/SkPaint.h"
13
14/**
15 * Configuration struct for SkHighContrastFilter.
16 *
17 * Provides transformations to improve contrast for users with low vision.
18 */
19struct SkHighContrastConfig {
20 enum class InvertStyle {
21 kNoInvert,
22 kInvertBrightness,
23 kInvertLightness,
24
25 kLast = kInvertLightness
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 */
75
76class SK_API SkHighContrastFilter {
77public:
78 // Returns the filter, or nullptr if the config is invalid.
79 static sk_sp<SkColorFilter> Make(const SkHighContrastConfig& config);
80
81 static void RegisterFlattenables();
82};
83
84#endif
85