1 /*
2  * Copyright 2012 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 SkDeviceProfile_DEFINED
9 #define SkDeviceProfile_DEFINED
10 
11 #include "SkRefCnt.h"
12 
13 class SkDeviceProfile : public SkRefCnt {
14 public:
15 
16 
17     enum LCDConfig {
18         kNone_LCDConfig,   // disables LCD text rendering, uses A8 instead
19         kRGB_Horizontal_LCDConfig,
20         kBGR_Horizontal_LCDConfig,
21         kRGB_Vertical_LCDConfig,
22         kBGR_Vertical_LCDConfig
23     };
24 
25     enum FontHintLevel {
26         kNone_FontHintLevel,
27         kSlight_FontHintLevel,
28         kNormal_FontHintLevel,
29         kFull_FontHintLevel,
30         kAuto_FontHintLevel
31     };
32 
33     /**
34      *  gammaExp is typically between 1.0 and 2.2. For no gamma adjustment,
35      *  specify 1.0
36      *
37      *  contrastScale will be pinned between 0.0 and 1.0. For no contrast
38      *  adjustment, specify 0.0
39      *
40      *  @param config   Describes the LCD layout for this device. If this is set
41      *                  to kNone, then all requests for LCD text will be
42      *                  devolved to A8 antialiasing.
43      *
44      *  @param level    The hinting level to be used, IF the paint specifies
45      *                  "default". Otherwise the paint's hinting level will be
46      *                  respected.
47      */
48     static SkDeviceProfile* Create(float gammaExp,
49                                    float contrastScale,
50                                    LCDConfig,
51                                    FontHintLevel);
52 
53     /**
54      *  Returns the global default profile, that is used if no global profile is
55      *  specified with SetGlobal(), or if nullptr is specified to SetGlobal().
56      *  The references count is *not* incremented, and the caller should not
57      *  call unref().
58      */
59     static SkDeviceProfile* GetDefault();
60 
61     /**
62      *  Return the current global profile (or the default if no global had yet
63      *  been set) and increment its reference count. The call *must* call unref()
64      *  when it is done using it.
65      */
66     static SkDeviceProfile* RefGlobal();
67 
68     /**
69      *  Make the specified profile be the global value for all subsequently
70      *  instantiated devices. Does not affect any existing devices.
71      *  Increments the reference count on the profile.
72      *  Specify nullptr for the "identity" profile (where there is no gamma or
73      *  contrast correction).
74      */
75     static void SetGlobal(SkDeviceProfile*);
76 
77     float getFontGammaExponent() const { return fGammaExponent; }
78     float getFontContrastScale() const { return fContrastScale; }
79 
80     /**
81      *  Given a luminance byte (0 for black, 0xFF for white), generate a table
82      *  that applies the gamma/contrast settings to linear coverage values.
83      */
84     void generateTableForLuminanceByte(U8CPU lumByte, uint8_t table[256]) const;
85 
86 private:
87     SkDeviceProfile(float gammaExp, float contrastScale, LCDConfig,
88                     FontHintLevel);
89 
90     float           fGammaExponent;
91     float           fContrastScale;
92     LCDConfig       fLCDConfig;
93     FontHintLevel   fFontHintLevel;
94 
95     typedef SkRefCnt INHERITED;
96 };
97 
98 #endif
99