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 kLast = kInvertLightness 26 }; 27 SkHighContrastConfigSkHighContrastConfig28 SkHighContrastConfig() { 29 fGrayscale = false; 30 fInvertStyle = InvertStyle::kNoInvert; 31 fContrast = 0.0f; 32 } 33 SkHighContrastConfigSkHighContrastConfig34 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. isValidSkHighContrastConfig42 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 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 81 static void RegisterFlattenables(); 82 }; 83 84 #endif 85