Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(95)

Unified Diff: src/gpu/GrDistanceFieldTextContext.cpp

Issue 258883002: Gamma correction for distance field text. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Add comments for the magic bold factor Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/gpu/GrDistanceFieldTextContext.cpp
diff --git a/src/gpu/GrDistanceFieldTextContext.cpp b/src/gpu/GrDistanceFieldTextContext.cpp
index 2d2f9a14432dd7aae4a719e6469858f30bb8ef84..9634fe88db9e1abefbca6cdd8451b787831856fa 100755
--- a/src/gpu/GrDistanceFieldTextContext.cpp
+++ b/src/gpu/GrDistanceFieldTextContext.cpp
@@ -7,10 +7,12 @@
#include "GrDistanceFieldTextContext.h"
#include "GrAtlas.h"
+#include "SkColorFilter.h"
#include "GrDrawTarget.h"
#include "GrDrawTargetCaps.h"
#include "GrFontScaler.h"
#include "SkGlyphCache.h"
+#include "GrGpu.h"
#include "GrIndexBuffer.h"
#include "GrTextStrike.h"
#include "GrTextStrike_impl.h"
@@ -33,6 +35,8 @@ static const int kLargeDFFontSize = 128;
SK_CONF_DECLARE(bool, c_DumpFontCache, "gpu.dumpFontCache", false,
"Dump the contents of the font cache before every purge.");
+GrTexture* gGammaTexture = NULL;
bsalomon 2014/05/28 19:53:53 This doesn't seem safe. There can be multiple GrCo
jvanverth1 2014/05/29 18:53:49 Changed to be a member of GrDistanceFieldTextConte
+
GrDistanceFieldTextContext::GrDistanceFieldTextContext(GrContext* context,
const SkDeviceProperties& properties,
bool enable)
@@ -107,14 +111,26 @@ void GrDistanceFieldTextContext::flushGlyphs() {
SkASSERT(SkIsAlign4(fCurrVertex));
SkASSERT(fCurrTexture);
GrTextureParams params(SkShader::kRepeat_TileMode, GrTextureParams::kBilerp_FilterMode);
+ GrTextureParams gammaParams(SkShader::kClamp_TileMode, GrTextureParams::kNone_FilterMode);
// Effects could be stored with one of the cache objects (atlas?)
+ SkColor filteredColor;
+ SkColorFilter* colorFilter = fSkPaint.getColorFilter();
+ if (NULL != colorFilter) {
+ filteredColor = colorFilter->filterColor(fSkPaint.getColor());
+ } else {
+ filteredColor = fSkPaint.getColor();
+ }
if (fUseLCDText) {
+ GrColor colorNoPreMul = skcolor_to_grcolor_nopremultiply(filteredColor);
bool useBGR = SkDeviceProperties::Geometry::kBGR_Layout ==
fDeviceProperties.fGeometry.getLayout();
drawState->addCoverageEffect(GrDistanceFieldLCDTextureEffect::Create(
fCurrTexture,
params,
+ gGammaTexture,
+ gammaParams,
+ colorNoPreMul,
fContext->getMatrix().rectStaysRect() &&
fContext->getMatrix().isSimilarity(),
useBGR),
@@ -133,10 +149,15 @@ void GrDistanceFieldTextContext::flushGlyphs() {
// paintAlpha
drawState->setColor(SkColorSetARGB(a, a, a, a));
// paintColor
- drawState->setBlendConstant(skcolor_to_grcolor_nopremultiply(fSkPaint.getColor()));
+ drawState->setBlendConstant(colorNoPreMul);
drawState->setBlendFunc(kConstC_GrBlendCoeff, kISC_GrBlendCoeff);
} else {
- drawState->addCoverageEffect(GrDistanceFieldTextureEffect::Create(fCurrTexture, params,
+ U8CPU lum = SkColorSpaceLuminance::computeLuminance(fDeviceProperties.fGamma,
+ filteredColor);
+ drawState->addCoverageEffect(GrDistanceFieldTextureEffect::Create(
+ fCurrTexture, params,
+ gGammaTexture, gammaParams,
+ lum/255.f,
fContext->getMatrix().isSimilarity()),
kGlyphCoordsAttributeIndex)->unref();
@@ -354,9 +375,7 @@ inline void GrDistanceFieldTextContext::init(const GrPaint& paint, const SkPaint
fUseLCDText = fSkPaint.isLCDRenderText();
- fSkPaint.setLCDRenderText(false);
- fSkPaint.setAutohinted(false);
- fSkPaint.setSubpixelText(true);
+ fSkPaint.setDistanceFieldTextTEMP(true);
}
inline void GrDistanceFieldTextContext::finish() {
@@ -365,6 +384,35 @@ inline void GrDistanceFieldTextContext::finish() {
GrTextContext::finish();
}
+static void setup_gamma_texture(GrContext* context, const SkGlyphCache* cache,
+ const SkDeviceProperties& deviceProperties) {
+ if (!gGammaTexture) {
reed1 2014/05/28 19:45:17 Seems like we need thread-protection for writing t
jvanverth1 2014/05/29 18:53:49 There should be only one GrDistanceFieldTextContex
+ int width, height;
+ SkScalar contrast = 0.5f;
+ SkScalar paintGamma = deviceProperties.fGamma;
+ SkScalar deviceGamma = deviceProperties.fGamma;
+ void *data = cache->getScalerContext()->getGammaLUTData(width, height, contrast,
+ paintGamma, deviceGamma);
+
+ // TODO: Update this to use the cache rather than directly creating a texture.
+ GrTextureDesc desc;
+ desc.fFlags = kDynamicUpdate_GrTextureFlagBit;
+ desc.fWidth = width;
+ desc.fHeight = height;
+ desc.fConfig = kAlpha_8_GrPixelConfig;
+
+ gGammaTexture = context->getGpu()->createTexture(desc, NULL, 0);
+ if (NULL == gGammaTexture) {
+ return;
+ }
+
+ context->writeTexturePixels(gGammaTexture,
+ 0, 0, width, height,
+ gGammaTexture->config(), data, 0,
+ GrContext::kDontFlush_PixelOpsFlag);
+ }
+}
+
void GrDistanceFieldTextContext::drawText(const GrPaint& paint, const SkPaint& skPaint,
const char text[], size_t byteLength,
SkScalar x, SkScalar y) {
@@ -386,6 +434,8 @@ void GrDistanceFieldTextContext::drawText(const GrPaint& paint, const SkPaint& s
SkGlyphCache* cache = autoCache.getCache();
GrFontScaler* fontScaler = GetGrFontScaler(cache);
+ setup_gamma_texture(fContext, cache, fDeviceProperties);
+
// need to measure first
// TODO - generate positions and pre-load cache as well?
const char* stop = text + byteLength;
@@ -459,6 +509,8 @@ void GrDistanceFieldTextContext::drawPosText(const GrPaint& paint, const SkPaint
SkGlyphCache* cache = autoCache.getCache();
GrFontScaler* fontScaler = GetGrFontScaler(cache);
+ setup_gamma_texture(fContext, cache, fDeviceProperties);
+
const char* stop = text + byteLength;
if (SkPaint::kLeft_Align == fSkPaint.getTextAlign()) {

Powered by Google App Engine
This is Rietveld 408576698