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
13class SkDeviceProfile : public SkRefCnt {
14public:
15    SK_DECLARE_INST_COUNT(SkDeviceProfile)
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 NULL 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 NULL 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
86private:
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