blob: 6d087e3baaae08d7a8fce0646930ebc604fc6dc9 [file] [log] [blame]
Romain Guyb45c0c92010-08-26 20:35:23 -07001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "OpenGLRenderer"
18
19#include "GammaFontRenderer.h"
20#include "Properties.h"
21
22namespace android {
23namespace uirenderer {
24
25///////////////////////////////////////////////////////////////////////////////
26// Constructors/destructor
27///////////////////////////////////////////////////////////////////////////////
28
29GammaFontRenderer::GammaFontRenderer() {
30 LOGD("Creating gamma font renderer");
31
32 // Get the renderer properties
33 char property[PROPERTY_VALUE_MAX];
34
35 // Get the gamma
36 float gamma = DEFAULT_TEXT_GAMMA;
37 if (property_get(PROPERTY_TEXT_GAMMA, property, NULL) > 0) {
38 LOGD(" Setting text gamma to %s", property);
39 gamma = atof(property);
40 } else {
41 LOGD(" Using default text gamma of %.2f", DEFAULT_TEXT_GAMMA);
42 }
43
44 // Get the black gamma threshold
45 mBlackThreshold = DEFAULT_TEXT_BLACK_GAMMA_THRESHOLD;
46 if (property_get(PROPERTY_TEXT_BLACK_GAMMA_THRESHOLD, property, NULL) > 0) {
47 LOGD(" Setting text black gamma threshold to %s", property);
48 mBlackThreshold = atoi(property);
49 } else {
50 LOGD(" Using default text black gamma threshold of %d",
51 DEFAULT_TEXT_BLACK_GAMMA_THRESHOLD);
52 }
53
54 // Get the white gamma threshold
55 mWhiteThreshold = DEFAULT_TEXT_WHITE_GAMMA_THRESHOLD;
56 if (property_get(PROPERTY_TEXT_WHITE_GAMMA_THRESHOLD, property, NULL) > 0) {
57 LOGD(" Setting text white gamma threshold to %s", property);
58 mWhiteThreshold = atoi(property);
59 } else {
60 LOGD(" Using default white black gamma threshold of %d",
61 DEFAULT_TEXT_WHITE_GAMMA_THRESHOLD);
62 }
63
64 // Compute the gamma tables
65 const float blackGamma = gamma;
66 const float whiteGamma = 1.0f / gamma;
67
68 for (uint32_t i = 0; i <= 255; i++) {
69 mDefault[i] = i;
70
71 const float v = i / 255.0f;
72 const float black = pow(v, blackGamma);
73 const float white = pow(v, whiteGamma);
74
75 mBlackGamma[i] = uint8_t((float)::floor(black * 255.0f + 0.5f));
76 mWhiteGamma[i] = uint8_t((float)::floor(white * 255.0f + 0.5f));
77 }
78
79 // Configure the font renderers
80 mDefaultRenderer.setGammaTable(&mDefault[0]);
81 mBlackGammaRenderer.setGammaTable(&mBlackGamma[0]);
82 mWhiteGammaRenderer.setGammaTable(&mWhiteGamma[0]);
83}
84
85FontRenderer& GammaFontRenderer::getFontRenderer(const SkPaint* paint) {
86 if (paint->getShader() == NULL) {
87 uint32_t c = paint->getColor();
88 const int r = (c >> 16) & 0xFF;
89 const int g = (c >> 8) & 0xFF;
90 const int b = (c ) & 0xFF;
91 const int luminance = (r * 2 + g * 5 + b) >> 3;
92
93 if (luminance <= mBlackThreshold) {
94 return mBlackGammaRenderer;
95 } else if (luminance >= mWhiteThreshold) {
96 return mWhiteGammaRenderer;
97 }
98 }
99 return mDefaultRenderer;
100}
101
102}; // namespace uirenderer
103}; // namespace android