/*
* Copyright 2012 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkDeviceProfile_DEFINED
#define SkDeviceProfile_DEFINED
#include "SkRefCnt.h"
class SkDeviceProfile : public SkRefCnt {
public:
enum LCDConfig {
kNone_LCDConfig, // disables LCD text rendering, uses A8 instead
kRGB_Horizontal_LCDConfig,
kBGR_Horizontal_LCDConfig,
kRGB_Vertical_LCDConfig,
kBGR_Vertical_LCDConfig
};
enum FontHintLevel {
kNone_FontHintLevel,
kSlight_FontHintLevel,
kNormal_FontHintLevel,
kFull_FontHintLevel,
kAuto_FontHintLevel
};
/**
* gammaExp is typically between 1.0 and 2.2. For no gamma adjustment,
* specify 1.0
*
* contrastScale will be pinned between 0.0 and 1.0. For no contrast
* adjustment, specify 0.0
*
* @param config Describes the LCD layout for this device. If this is set
* to kNone, then all requests for LCD text will be
* devolved to A8 antialiasing.
*
* @param level The hinting level to be used, IF the paint specifies
* "default". Otherwise the paint's hinting level will be
* respected.
*/
static SkDeviceProfile* Create(float gammaExp,
float contrastScale,
LCDConfig,
FontHintLevel);
/**
* Returns the global default profile, that is used if no global profile is
* specified with SetGlobal(), or if nullptr is specified to SetGlobal().
* The references count is *not* incremented, and the caller should not
* call unref().
*/
static SkDeviceProfile* GetDefault();
/**
* Return the current global profile (or the default if no global had yet
* been set) and increment its reference count. The call *must* call unref()
* when it is done using it.
*/
static SkDeviceProfile* RefGlobal();
/**
* Make the specified profile be the global value for all subsequently
* instantiated devices. Does not affect any existing devices.
* Increments the reference count on the profile.
* Specify nullptr for the "identity" profile (where there is no gamma or
* contrast correction).
*/
static void SetGlobal(SkDeviceProfile*);
float getFontGammaExponent() const { return fGammaExponent; }
float getFontContrastScale() const { return fContrastScale; }
/**
* Given a luminance byte (0 for black, 0xFF for white), generate a table
* that applies the gamma/contrast settings to linear coverage values.
*/
void generateTableForLuminanceByte(U8CPU lumByte, uint8_t table[256]) const;
private:
SkDeviceProfile(float gammaExp, float contrastScale, LCDConfig,
FontHintLevel);
float fGammaExponent;
float fContrastScale;
LCDConfig fLCDConfig;
FontHintLevel fFontHintLevel;
typedef SkRefCnt INHERITED;
};
#endif