diff options
author | Alex Sakhartchouk <alexst@google.com> | 2010-10-01 15:20:41 -0700 |
---|---|---|
committer | Alex Sakhartchouk <alexst@google.com> | 2010-10-01 15:20:41 -0700 |
commit | 3bf3ea0d839010cc9e0e5a6bd51c325d375f679d (patch) | |
tree | ce8e58b48d84b22e90b10c37291b1b714a5e6d33 /libs/rs | |
parent | feede2aee6fe3e721ee71ffc35b277f1d9260e03 (diff) | |
download | frameworks_base-3bf3ea0d839010cc9e0e5a6bd51c325d375f679d.zip frameworks_base-3bf3ea0d839010cc9e0e5a6bd51c325d375f679d.tar.gz frameworks_base-3bf3ea0d839010cc9e0e5a6bd51c325d375f679d.tar.bz2 |
Fix for bug 3053078
Font gamma correction to match with lib HWUI.
Change-Id: I329a2f97058f4929b96724c9df39fbfad4243b33
Diffstat (limited to 'libs/rs')
-rw-r--r-- | libs/rs/rsFont.cpp | 74 | ||||
-rw-r--r-- | libs/rs/rsFont.h | 22 |
2 files changed, 82 insertions, 14 deletions
diff --git a/libs/rs/rsFont.cpp b/libs/rs/rsFont.cpp index 12dedac..c516ea9 100644 --- a/libs/rs/rsFont.cpp +++ b/libs/rs/rsFont.cpp @@ -23,6 +23,7 @@ #include "rsFont.h" #include "rsProgramFragment.h" +#include <cutils/properties.h> #include FT_BITMAP_H #include <GLES/gl.h> @@ -268,6 +269,44 @@ FontState::FontState() mRSC = NULL; mLibrary = NULL; setFontColor(0.1f, 0.1f, 0.1f, 1.0f); + + // Get the renderer properties + char property[PROPERTY_VALUE_MAX]; + + // Get the gamma + float gamma = DEFAULT_TEXT_GAMMA; + if (property_get(PROPERTY_TEXT_GAMMA, property, NULL) > 0) { + LOGD(" Setting text gamma to %s", property); + gamma = atof(property); + } else { + LOGD(" Using default text gamma of %.2f", DEFAULT_TEXT_GAMMA); + } + + // Get the black gamma threshold + int blackThreshold = DEFAULT_TEXT_BLACK_GAMMA_THRESHOLD; + if (property_get(PROPERTY_TEXT_BLACK_GAMMA_THRESHOLD, property, NULL) > 0) { + LOGD(" Setting text black gamma threshold to %s", property); + blackThreshold = atoi(property); + } else { + LOGD(" Using default text black gamma threshold of %d", + DEFAULT_TEXT_BLACK_GAMMA_THRESHOLD); + } + mBlackThreshold = (float)(blackThreshold) / 255.0f; + + // Get the white gamma threshold + int whiteThreshold = DEFAULT_TEXT_WHITE_GAMMA_THRESHOLD; + if (property_get(PROPERTY_TEXT_WHITE_GAMMA_THRESHOLD, property, NULL) > 0) { + LOGD(" Setting text white gamma threshold to %s", property); + whiteThreshold = atoi(property); + } else { + LOGD(" Using default white black gamma threshold of %d", + DEFAULT_TEXT_WHITE_GAMMA_THRESHOLD); + } + mWhiteThreshold = (float)(whiteThreshold) / 255.0f; + + // Compute the gamma tables + mBlackGamma = gamma; + mWhiteGamma = 1.0f / gamma; } FontState::~FontState() @@ -391,12 +430,15 @@ void FontState::initRenderState() shaderString.append("void main() {\n"); shaderString.append(" lowp vec4 col = UNI_Color;\n"); shaderString.append(" col.a = texture2D(UNI_Tex0, varTex0.xy).a;\n"); + shaderString.append(" col.a = pow(col.a, UNI_Gamma);\n"); shaderString.append(" gl_FragColor = col;\n"); shaderString.append("}\n"); const Element *colorElem = Element::create(mRSC, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 4); + const Element *gammaElem = Element::create(mRSC, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 1); mRSC->mStateElement.elementBuilderBegin(); mRSC->mStateElement.elementBuilderAdd(colorElem, "Color", 1); + mRSC->mStateElement.elementBuilderAdd(gammaElem, "Gamma", 1); const Element *constInput = mRSC->mStateElement.elementBuilderCreate(mRSC); Type *inputType = new Type(mRSC); @@ -558,9 +600,9 @@ void FontState::issueDrawCommand() { ObjectBaseRef<const ProgramStore> tmpPS(mRSC->getFragmentStore()); mRSC->setFragmentStore(mFontProgramStore.get()); - if(mFontColorDirty) { - mFontShaderFConstant->data(mRSC, &mFontColor, 4*sizeof(float)); - mFontColorDirty = false; + if(mConstantsDirty) { + mFontShaderFConstant->data(mRSC, &mConstants, sizeof(mConstants)); + mConstantsDirty = false; } if (!mRSC->setupCheck()) { @@ -725,18 +767,26 @@ void FontState::renderText(Allocation *alloc, uint32_t start, int len, int x, in } void FontState::setFontColor(float r, float g, float b, float a) { - mFontColor[0] = r; - mFontColor[1] = g; - mFontColor[2] = b; - mFontColor[3] = a; - mFontColorDirty = true; + mConstants.mFontColor[0] = r; + mConstants.mFontColor[1] = g; + mConstants.mFontColor[2] = b; + mConstants.mFontColor[3] = a; + + mConstants.mGamma = 1.0f; + const int luminance = (r * 2.0f + g * 5.0f + b) / 8.0f; + if (luminance <= mBlackThreshold) { + mConstants.mGamma = mBlackGamma; + } else if (luminance >= mWhiteThreshold) { + mConstants.mGamma = mWhiteGamma; + } + mConstantsDirty = true; } void FontState::getFontColor(float *r, float *g, float *b, float *a) const { - *r = mFontColor[0]; - *g = mFontColor[1]; - *b = mFontColor[2]; - *a = mFontColor[3]; + *r = mConstants.mFontColor[0]; + *g = mConstants.mFontColor[1]; + *b = mConstants.mFontColor[2]; + *a = mConstants.mFontColor[3]; } void FontState::deinit(Context *rsc) diff --git a/libs/rs/rsFont.h b/libs/rs/rsFont.h index 027ed1d..16009ef 100644 --- a/libs/rs/rsFont.h +++ b/libs/rs/rsFont.h @@ -31,6 +31,15 @@ namespace android { namespace renderscript { +// Gamma (>= 1.0, <= 10.0) +#define PROPERTY_TEXT_GAMMA "ro.text_gamma" +#define PROPERTY_TEXT_BLACK_GAMMA_THRESHOLD "ro.text_gamma.black_threshold" +#define PROPERTY_TEXT_WHITE_GAMMA_THRESHOLD "ro.text_gamma.white_threshold" + +#define DEFAULT_TEXT_GAMMA 1.4f +#define DEFAULT_TEXT_BLACK_GAMMA_THRESHOLD 64 +#define DEFAULT_TEXT_WHITE_GAMMA_THRESHOLD 192 + class FontState; class Font : public ObjectBase @@ -162,8 +171,17 @@ protected: Context *mRSC; - float mFontColor[4]; - bool mFontColorDirty; + struct { + float mFontColor[4]; + float mGamma; + } mConstants; + bool mConstantsDirty; + + float mBlackGamma; + float mWhiteGamma; + + float mBlackThreshold; + float mWhiteThreshold; // Free type library, we only need one copy FT_Library mLibrary; |