OLD | NEW |
| (Empty) |
1 #include "SkFontHost.h" | |
2 #include <math.h> | |
3 | |
4 // define this to use pre-compiled tables for gamma. This is slightly faster, | |
5 // and doesn't create any RW global memory, but means we cannot change the | |
6 // gamma at runtime. | |
7 #define USE_PREDEFINED_GAMMA_TABLES | |
8 | |
9 #ifndef USE_PREDEFINED_GAMMA_TABLES | |
10 // define this if you want to spew out the "C" code for the tables, given | |
11 // the current values for SK_BLACK_GAMMA and SK_WHITE_GAMMA. | |
12 #define DUMP_GAMMA_TABLESx | |
13 #endif | |
14 | |
15 /////////////////////////////////////////////////////////////////////////////// | |
16 | |
17 #ifdef USE_PREDEFINED_GAMMA_TABLES | |
18 | |
19 #include "sk_predefined_gamma.h" | |
20 | |
21 #else // use writable globals for gamma tables | |
22 | |
23 static bool gGammaIsBuilt; | |
24 static uint8_t gBlackGamma[256], gWhiteGamma[256]; | |
25 | |
26 #define SK_BLACK_GAMMA (1.4f) | |
27 #define SK_WHITE_GAMMA (1/1.4f) | |
28 | |
29 static void build_power_table(uint8_t table[], float ee) | |
30 { | |
31 // printf("------ build_power_table %g\n", ee); | |
32 for (int i = 0; i < 256; i++) | |
33 { | |
34 float x = i / 255.f; | |
35 // printf(" %d %g", i, x); | |
36 x = powf(x, ee); | |
37 // printf(" %g", x); | |
38 int xx = SkScalarRound(SkFloatToScalar(x * 255)); | |
39 // printf(" %d\n", xx); | |
40 table[i] = SkToU8(xx); | |
41 } | |
42 } | |
43 | |
44 #ifdef DUMP_GAMMA_TABLES | |
45 | |
46 #include "SkString.h" | |
47 | |
48 static void dump_a_table(const char name[], const uint8_t table[], | |
49 float gamma) { | |
50 SkDebugf("\n"); | |
51 SkDebugf("\/\/ Gamma table for %g\n", gamma); | |
52 SkDebugf("static const uint8_t %s[] = {\n", name); | |
53 for (int y = 0; y < 16; y++) { | |
54 SkString line, tmp; | |
55 for (int x = 0; x < 16; x++) { | |
56 tmp.printf("0x%02X, ", *table++); | |
57 line.append(tmp); | |
58 } | |
59 SkDebugf(" %s\n", line.c_str()); | |
60 } | |
61 SkDebugf("};\n"); | |
62 } | |
63 | |
64 #endif | |
65 | |
66 #endif | |
67 | |
68 /////////////////////////////////////////////////////////////////////////////// | |
69 | |
70 void SkFontHost::GetGammaTables(const uint8_t* tables[2]) | |
71 { | |
72 #ifndef USE_PREDEFINED_GAMMA_TABLES | |
73 if (!gGammaIsBuilt) | |
74 { | |
75 build_power_table(gBlackGamma, SK_BLACK_GAMMA); | |
76 build_power_table(gWhiteGamma, SK_WHITE_GAMMA); | |
77 gGammaIsBuilt = true; | |
78 | |
79 #ifdef DUMP_GAMMA_TABLES | |
80 dump_a_table("gBlackGamma", gBlackGamma, SK_BLACK_GAMMA); | |
81 dump_a_table("gWhiteGamma", gWhiteGamma, SK_WHITE_GAMMA); | |
82 #endif | |
83 } | |
84 #endif | |
85 tables[0] = gBlackGamma; | |
86 tables[1] = gWhiteGamma; | |
87 } | |
88 | |
89 // If the luminance is <= this value, then apply the black gamma table | |
90 #define BLACK_GAMMA_THRESHOLD 0x40 | |
91 | |
92 // If the luminance is >= this value, then apply the white gamma table | |
93 #define WHITE_GAMMA_THRESHOLD 0xC0 | |
94 | |
95 int SkFontHost::ComputeGammaFlag(const SkPaint& paint) | |
96 { | |
97 if (paint.getShader() == NULL) | |
98 { | |
99 SkColor c = paint.getColor(); | |
100 int r = SkColorGetR(c); | |
101 int g = SkColorGetG(c); | |
102 int b = SkColorGetB(c); | |
103 int luminance = (r * 2 + g * 5 + b) >> 3; | |
104 | |
105 if (luminance <= BLACK_GAMMA_THRESHOLD) | |
106 { | |
107 // printf("------ black gamma for [%d %d %d]\n", r, g, b); | |
108 return SkScalerContext::kGammaForBlack_Flag; | |
109 } | |
110 if (luminance >= WHITE_GAMMA_THRESHOLD) | |
111 { | |
112 // printf("------ white gamma for [%d %d %d]\n", r, g, b); | |
113 return SkScalerContext::kGammaForWhite_Flag; | |
114 } | |
115 } | |
116 return 0; | |
117 } | |
118 | |
OLD | NEW |