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
9#include "SkDeviceProfile.h"
10#include "SkThread.h"
11
12#define DEFAULT_GAMMAEXP        2.2f
13#define DEFAULT_CONTRASTSCALE   0.5f
14#define DEFAULT_LCDCONFIG       SkDeviceProfile::kNone_LCDConfig
15#define DEFAULT_FONTHINTLEVEL   SkDeviceProfile::kSlight_FontHintLevel
16
17static float pin(float value, float min, float max) {
18    if (value < min) {
19        value = min;
20    } else if (value > max) {
21        value = max;
22    }
23    return value;
24}
25
26SkDeviceProfile::SkDeviceProfile(float gammaExp, float contrast,
27                                 LCDConfig config, FontHintLevel level) {
28    fGammaExponent = pin(gammaExp, 0, 10);
29    fContrastScale = pin(contrast, 0, 1);
30    fLCDConfig = config;
31    fFontHintLevel = level;
32}
33
34void SkDeviceProfile::generateTableForLuminanceByte(U8CPU lumByte,
35                                                    uint8_t table[256]) const {
36}
37
38///////////////////////////////////////////////////////////////////////////////
39
40SkDeviceProfile* SkDeviceProfile::Create(float gammaExp,
41                                         float contrast,
42                                         LCDConfig config,
43                                         FontHintLevel level) {
44    return SkNEW_ARGS(SkDeviceProfile, (gammaExp, contrast, config, level));
45}
46
47SK_DECLARE_STATIC_MUTEX(gMutex);
48static SkDeviceProfile* gDefaultProfile;
49static SkDeviceProfile* gGlobalProfile;
50
51SkDeviceProfile* SkDeviceProfile::GetDefault() {
52    SkAutoMutexAcquire amc(gMutex);
53
54    if (NULL == gDefaultProfile) {
55        gDefaultProfile = SkDeviceProfile::Create(DEFAULT_GAMMAEXP,
56                                                  DEFAULT_CONTRASTSCALE,
57                                                  DEFAULT_LCDCONFIG,
58                                                  DEFAULT_FONTHINTLEVEL);
59    }
60    return gDefaultProfile;
61}
62
63SkDeviceProfile* SkDeviceProfile::RefGlobal() {
64    SkAutoMutexAcquire amc(gMutex);
65
66    if (NULL == gGlobalProfile) {
67        gGlobalProfile = SkDeviceProfile::GetDefault();
68    }
69    gGlobalProfile->ref();
70    return gGlobalProfile;
71}
72
73void SkDeviceProfile::SetGlobal(SkDeviceProfile* profile) {
74    SkAutoMutexAcquire amc(gMutex);
75
76    SkRefCnt_SafeAssign(gGlobalProfile, profile);
77}
78