sRGB text fake-gamma progress:
Determine if we should use fake-gamma based on the render target format and paint parameters (ie will gamma-correct blending happen?). Plumb that down to the appropriate places in the bitmap text rendering for now. Still need to alter the behavior of the DF text renderer (using the same cue, most likely?). Also, this still doesn't account for the contrast hack. The end result of this change is a pleasant normalizing of weight when viewing text in the gpusrgb config. (Dark text gets heavier, light text gets lighter). BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1865953003 Review URL: https://codereview.chromium.org/1865953003
This commit is contained in:
parent
044d3c1858
commit
32f7782706
@ -53,6 +53,17 @@ GrColor GrAtlasTextContext::ComputeCanonicalColor(const SkPaint& paint, bool lcd
|
||||
return canonicalColor;
|
||||
}
|
||||
|
||||
SkPaint::FakeGamma GrAtlasTextContext::ComputeFakeGamma(GrDrawContext* dc, const GrPaint& grPaint) {
|
||||
// If we're rendering to an sRGB render target, and we aren't forcing sRGB blending off,
|
||||
// then we can disable the gamma hacks. Otherwise, leave them on:
|
||||
if (GrPixelConfigIsSRGB(dc->accessRenderTarget()->config()) &&
|
||||
!grPaint.getDisableOutputConversionToSRGB()) {
|
||||
return SkPaint::FakeGamma::Off;
|
||||
} else {
|
||||
return SkPaint::FakeGamma::On;
|
||||
}
|
||||
}
|
||||
|
||||
// TODO if this function ever shows up in profiling, then we can compute this value when the
|
||||
// textblob is being built and cache it. However, for the time being textblobs mostly only have 1
|
||||
// run so this is not a big deal to compute here.
|
||||
@ -116,6 +127,8 @@ void GrAtlasTextContext::drawTextBlob(GrContext* context, GrDrawContext* dc,
|
||||
return;
|
||||
}
|
||||
|
||||
SkPaint::FakeGamma fakeGamma = ComputeFakeGamma(dc, grPaint);
|
||||
|
||||
if (cacheBlob) {
|
||||
if (cacheBlob->mustRegenerate(skPaint, grPaint.getColor(), blurRec, viewMatrix, x, y)) {
|
||||
// We have to remake the blob because changes may invalidate our masks.
|
||||
@ -125,7 +138,7 @@ void GrAtlasTextContext::drawTextBlob(GrContext* context, GrDrawContext* dc,
|
||||
cacheBlob.reset(SkRef(cache->createCachedBlob(blob, key, blurRec, skPaint)));
|
||||
RegenerateTextBlob(cacheBlob, context->getBatchFontCache(),
|
||||
*context->caps()->shaderCaps(), skPaint, grPaint.getColor(),
|
||||
viewMatrix, props,
|
||||
fakeGamma, viewMatrix, props,
|
||||
blob, x, y, drawFilter);
|
||||
} else {
|
||||
cache->makeMRU(cacheBlob);
|
||||
@ -138,7 +151,7 @@ void GrAtlasTextContext::drawTextBlob(GrContext* context, GrDrawContext* dc,
|
||||
sanityBlob->setupKey(key, blurRec, skPaint);
|
||||
RegenerateTextBlob(sanityBlob, context->getBatchFontCache(),
|
||||
*context->caps()->shaderCaps(), skPaint,
|
||||
grPaint.getColor(), viewMatrix, props,
|
||||
grPaint.getColor(), fakeGamma, viewMatrix, props,
|
||||
blob, x, y, drawFilter);
|
||||
GrAtlasTextBlob::AssertEqual(*sanityBlob, *cacheBlob);
|
||||
}
|
||||
@ -151,7 +164,7 @@ void GrAtlasTextContext::drawTextBlob(GrContext* context, GrDrawContext* dc,
|
||||
}
|
||||
RegenerateTextBlob(cacheBlob, context->getBatchFontCache(),
|
||||
*context->caps()->shaderCaps(), skPaint, grPaint.getColor(),
|
||||
viewMatrix, props,
|
||||
fakeGamma, viewMatrix, props,
|
||||
blob, x, y, drawFilter);
|
||||
}
|
||||
|
||||
@ -163,6 +176,7 @@ void GrAtlasTextContext::RegenerateTextBlob(GrAtlasTextBlob* cacheBlob,
|
||||
GrBatchFontCache* fontCache,
|
||||
const GrShaderCaps& shaderCaps,
|
||||
const SkPaint& skPaint, GrColor color,
|
||||
SkPaint::FakeGamma fakeGamma,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkSurfaceProps& props,
|
||||
const SkTextBlob* blob, SkScalar x, SkScalar y,
|
||||
@ -194,7 +208,7 @@ void GrAtlasTextContext::RegenerateTextBlob(GrAtlasTextBlob* cacheBlob,
|
||||
switch (it.positioning()) {
|
||||
case SkTextBlob::kDefault_Positioning: {
|
||||
GrTextUtils::DrawDFText(cacheBlob, run, fontCache,
|
||||
props, runPaint, color, viewMatrix,
|
||||
props, runPaint, color, fakeGamma, viewMatrix,
|
||||
(const char *)it.glyphs(), textLen,
|
||||
x + offset.x(), y + offset.y());
|
||||
break;
|
||||
@ -202,7 +216,7 @@ void GrAtlasTextContext::RegenerateTextBlob(GrAtlasTextBlob* cacheBlob,
|
||||
case SkTextBlob::kHorizontal_Positioning: {
|
||||
SkPoint dfOffset = SkPoint::Make(x, y + offset.y());
|
||||
GrTextUtils::DrawDFPosText(cacheBlob, run, fontCache,
|
||||
props, runPaint, color, viewMatrix,
|
||||
props, runPaint, color, fakeGamma, viewMatrix,
|
||||
(const char*)it.glyphs(), textLen, it.pos(),
|
||||
1, dfOffset);
|
||||
break;
|
||||
@ -210,7 +224,7 @@ void GrAtlasTextContext::RegenerateTextBlob(GrAtlasTextBlob* cacheBlob,
|
||||
case SkTextBlob::kFull_Positioning: {
|
||||
SkPoint dfOffset = SkPoint::Make(x, y);
|
||||
GrTextUtils::DrawDFPosText(cacheBlob, run, fontCache,
|
||||
props, runPaint, color, viewMatrix,
|
||||
props, runPaint, color, fakeGamma, viewMatrix,
|
||||
(const char*)it.glyphs(), textLen, it.pos(),
|
||||
2, dfOffset);
|
||||
break;
|
||||
@ -222,19 +236,19 @@ void GrAtlasTextContext::RegenerateTextBlob(GrAtlasTextBlob* cacheBlob,
|
||||
switch (it.positioning()) {
|
||||
case SkTextBlob::kDefault_Positioning:
|
||||
GrTextUtils::DrawBmpText(cacheBlob, run, fontCache,
|
||||
props, runPaint, color, viewMatrix,
|
||||
props, runPaint, color, fakeGamma, viewMatrix,
|
||||
(const char *)it.glyphs(), textLen,
|
||||
x + offset.x(), y + offset.y());
|
||||
break;
|
||||
case SkTextBlob::kHorizontal_Positioning:
|
||||
GrTextUtils::DrawBmpPosText(cacheBlob, run, fontCache,
|
||||
props, runPaint, color, viewMatrix,
|
||||
props, runPaint, color, fakeGamma, viewMatrix,
|
||||
(const char*)it.glyphs(), textLen, it.pos(), 1,
|
||||
SkPoint::Make(x, y + offset.y()));
|
||||
break;
|
||||
case SkTextBlob::kFull_Positioning:
|
||||
GrTextUtils::DrawBmpPosText(cacheBlob, run, fontCache,
|
||||
props, runPaint, color, viewMatrix,
|
||||
props, runPaint, color, fakeGamma, viewMatrix,
|
||||
(const char*)it.glyphs(), textLen, it.pos(), 2,
|
||||
SkPoint::Make(x, y));
|
||||
break;
|
||||
@ -254,6 +268,7 @@ GrAtlasTextContext::CreateDrawTextBlob(GrTextBlobCache* blobCache,
|
||||
const GrShaderCaps& shaderCaps,
|
||||
const GrPaint& paint,
|
||||
const SkPaint& skPaint,
|
||||
SkPaint::FakeGamma fakeGamma,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkSurfaceProps& props,
|
||||
const char text[], size_t byteLength,
|
||||
@ -265,11 +280,11 @@ GrAtlasTextContext::CreateDrawTextBlob(GrTextBlobCache* blobCache,
|
||||
|
||||
if (GrTextUtils::CanDrawAsDistanceFields(skPaint, viewMatrix, props, shaderCaps)) {
|
||||
GrTextUtils::DrawDFText(blob, 0, fontCache, props,
|
||||
skPaint, paint.getColor(), viewMatrix, text,
|
||||
skPaint, paint.getColor(), fakeGamma, viewMatrix, text,
|
||||
byteLength, x, y);
|
||||
} else {
|
||||
GrTextUtils::DrawBmpText(blob, 0, fontCache, props, skPaint,
|
||||
paint.getColor(), viewMatrix, text, byteLength, x, y);
|
||||
paint.getColor(), fakeGamma, viewMatrix, text, byteLength, x, y);
|
||||
}
|
||||
return blob;
|
||||
}
|
||||
@ -277,7 +292,7 @@ GrAtlasTextContext::CreateDrawTextBlob(GrTextBlobCache* blobCache,
|
||||
inline GrAtlasTextBlob*
|
||||
GrAtlasTextContext::CreateDrawPosTextBlob(GrTextBlobCache* blobCache, GrBatchFontCache* fontCache,
|
||||
const GrShaderCaps& shaderCaps, const GrPaint& paint,
|
||||
const SkPaint& skPaint,
|
||||
const SkPaint& skPaint, SkPaint::FakeGamma fakeGamma,
|
||||
const SkMatrix& viewMatrix, const SkSurfaceProps& props,
|
||||
const char text[], size_t byteLength,
|
||||
const SkScalar pos[], int scalarsPerPosition,
|
||||
@ -289,11 +304,11 @@ GrAtlasTextContext::CreateDrawPosTextBlob(GrTextBlobCache* blobCache, GrBatchFon
|
||||
|
||||
if (GrTextUtils::CanDrawAsDistanceFields(skPaint, viewMatrix, props, shaderCaps)) {
|
||||
GrTextUtils::DrawDFPosText(blob, 0, fontCache, props,
|
||||
skPaint, paint.getColor(), viewMatrix, text,
|
||||
skPaint, paint.getColor(), fakeGamma, viewMatrix, text,
|
||||
byteLength, pos, scalarsPerPosition, offset);
|
||||
} else {
|
||||
GrTextUtils::DrawBmpPosText(blob, 0, fontCache, props, skPaint,
|
||||
paint.getColor(), viewMatrix, text,
|
||||
paint.getColor(), fakeGamma, viewMatrix, text,
|
||||
byteLength, pos, scalarsPerPosition, offset);
|
||||
}
|
||||
return blob;
|
||||
@ -314,6 +329,7 @@ void GrAtlasTextContext::drawText(GrContext* context,
|
||||
CreateDrawTextBlob(context->getTextBlobCache(), context->getBatchFontCache(),
|
||||
*context->caps()->shaderCaps(),
|
||||
paint, skPaint,
|
||||
ComputeFakeGamma(dc, paint),
|
||||
viewMatrix, props,
|
||||
text, byteLength, x, y));
|
||||
blob->flushThrowaway(context, dc, props, fDistanceAdjustTable, skPaint, paint,
|
||||
@ -342,7 +358,9 @@ void GrAtlasTextContext::drawPosText(GrContext* context,
|
||||
CreateDrawPosTextBlob(context->getTextBlobCache(),
|
||||
context->getBatchFontCache(),
|
||||
*context->caps()->shaderCaps(),
|
||||
paint, skPaint, viewMatrix, props,
|
||||
paint, skPaint,
|
||||
ComputeFakeGamma(dc, paint),
|
||||
viewMatrix, props,
|
||||
text, byteLength,
|
||||
pos, scalarsPerPosition,
|
||||
offset));
|
||||
@ -405,6 +423,7 @@ DRAW_BATCH_TEST_DEFINE(TextBlobBatch) {
|
||||
GrAtlasTextContext::CreateDrawTextBlob(context->getTextBlobCache(),
|
||||
context->getBatchFontCache(),
|
||||
*context->caps()->shaderCaps(), grPaint, skPaint,
|
||||
GrAtlasTextContext::kTextBlobBatchFakeGamma,
|
||||
viewMatrix,
|
||||
gSurfaceProps, text,
|
||||
static_cast<size_t>(textLen), x, y));
|
||||
|
@ -52,10 +52,12 @@ private:
|
||||
|
||||
// sets up the descriptor on the blob and returns a detached cache. Client must attach
|
||||
inline static GrColor ComputeCanonicalColor(const SkPaint&, bool lcd);
|
||||
// Determines if we need to use FakeGamma:
|
||||
inline static SkPaint::FakeGamma ComputeFakeGamma(GrDrawContext*, const GrPaint&);
|
||||
static void RegenerateTextBlob(GrAtlasTextBlob* bmp,
|
||||
GrBatchFontCache*,
|
||||
const GrShaderCaps&,
|
||||
const SkPaint& skPaint, GrColor,
|
||||
const SkPaint& skPaint, GrColor, SkPaint::FakeGamma,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkSurfaceProps&,
|
||||
const SkTextBlob* blob, SkScalar x, SkScalar y,
|
||||
@ -65,14 +67,16 @@ private:
|
||||
static inline GrAtlasTextBlob* CreateDrawTextBlob(GrTextBlobCache*,
|
||||
GrBatchFontCache*, const GrShaderCaps&,
|
||||
const GrPaint&,
|
||||
const SkPaint&, const SkMatrix& viewMatrix,
|
||||
const SkPaint&, SkPaint::FakeGamma,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkSurfaceProps&,
|
||||
const char text[], size_t byteLength,
|
||||
SkScalar x, SkScalar y);
|
||||
static inline GrAtlasTextBlob* CreateDrawPosTextBlob(GrTextBlobCache*, GrBatchFontCache*,
|
||||
const GrShaderCaps&,
|
||||
const GrPaint&,
|
||||
const SkPaint&, const SkMatrix& viewMatrix,
|
||||
const SkPaint&, SkPaint::FakeGamma,
|
||||
const SkMatrix& viewMatrix,
|
||||
const SkSurfaceProps&,
|
||||
const char text[], size_t byteLength,
|
||||
const SkScalar pos[],
|
||||
@ -83,6 +87,7 @@ private:
|
||||
SkAutoTUnref<const GrDistanceFieldAdjustTable> fDistanceAdjustTable;
|
||||
|
||||
#ifdef GR_TEST_UTILS
|
||||
static const SkPaint::FakeGamma kTextBlobBatchFakeGamma = SkPaint::FakeGamma::On;
|
||||
DRAW_BATCH_TEST_FRIEND(TextBlobBatch);
|
||||
#endif
|
||||
};
|
||||
|
@ -40,7 +40,7 @@ static const int kLargeDFFontLimit = 2 * kLargeDFFontSize;
|
||||
void GrTextUtils::DrawBmpText(GrAtlasTextBlob* blob, int runIndex,
|
||||
GrBatchFontCache* fontCache,
|
||||
const SkSurfaceProps& props, const SkPaint& skPaint,
|
||||
GrColor color,
|
||||
GrColor color, SkPaint::FakeGamma fakeGamma,
|
||||
const SkMatrix& viewMatrix,
|
||||
const char text[], size_t byteLength,
|
||||
SkScalar x, SkScalar y) {
|
||||
@ -57,7 +57,7 @@ void GrTextUtils::DrawBmpText(GrAtlasTextBlob* blob, int runIndex,
|
||||
GrBatchTextStrike* currStrike = nullptr;
|
||||
|
||||
// Get GrFontScaler from cache
|
||||
SkGlyphCache* cache = blob->setupCache(runIndex, props, SkPaint::FakeGamma::On,
|
||||
SkGlyphCache* cache = blob->setupCache(runIndex, props, fakeGamma,
|
||||
skPaint, &viewMatrix);
|
||||
GrFontScaler* fontScaler = GrTextUtils::GetGrFontScaler(cache);
|
||||
|
||||
@ -80,7 +80,7 @@ void GrTextUtils::DrawBmpText(GrAtlasTextBlob* blob, int runIndex,
|
||||
void GrTextUtils::DrawBmpPosText(GrAtlasTextBlob* blob, int runIndex,
|
||||
GrBatchFontCache* fontCache,
|
||||
const SkSurfaceProps& props, const SkPaint& skPaint,
|
||||
GrColor color,
|
||||
GrColor color, SkPaint::FakeGamma fakeGamma,
|
||||
const SkMatrix& viewMatrix,
|
||||
const char text[], size_t byteLength,
|
||||
const SkScalar pos[], int scalarsPerPosition,
|
||||
@ -99,7 +99,7 @@ void GrTextUtils::DrawBmpPosText(GrAtlasTextBlob* blob, int runIndex,
|
||||
GrBatchTextStrike* currStrike = nullptr;
|
||||
|
||||
// Get GrFontScaler from cache
|
||||
SkGlyphCache* cache = blob->setupCache(runIndex, props, SkPaint::FakeGamma::On,
|
||||
SkGlyphCache* cache = blob->setupCache(runIndex, props, fakeGamma,
|
||||
skPaint, &viewMatrix);
|
||||
GrFontScaler* fontScaler = GrTextUtils::GetGrFontScaler(cache);
|
||||
|
||||
@ -247,7 +247,7 @@ void GrTextUtils::InitDistanceFieldPaint(GrAtlasTextBlob* blob,
|
||||
|
||||
void GrTextUtils::DrawDFText(GrAtlasTextBlob* blob, int runIndex,
|
||||
GrBatchFontCache* fontCache, const SkSurfaceProps& props,
|
||||
const SkPaint& skPaint, GrColor color,
|
||||
const SkPaint& skPaint, GrColor color, SkPaint::FakeGamma fakeGamma,
|
||||
const SkMatrix& viewMatrix,
|
||||
const char text[], size_t byteLength,
|
||||
SkScalar x, SkScalar y) {
|
||||
@ -260,6 +260,8 @@ void GrTextUtils::DrawDFText(GrAtlasTextBlob* blob, int runIndex,
|
||||
|
||||
SkPaint::GlyphCacheProc glyphCacheProc = skPaint.getGlyphCacheProc(true);
|
||||
SkAutoDescriptor desc;
|
||||
// We apply the fake-gamma by altering the distance in the shader, so we ignore the
|
||||
// fakeGamma parameter. (It's only used when we fall-back to bitmap text).
|
||||
skPaint.getScalerContextDescriptor(&desc, props, SkPaint::FakeGamma::Off, nullptr);
|
||||
SkGlyphCache* origPaintCache = SkGlyphCache::DetachCache(skPaint.getTypeface(),
|
||||
desc.getDesc());
|
||||
@ -310,14 +312,15 @@ void GrTextUtils::DrawDFText(GrAtlasTextBlob* blob, int runIndex,
|
||||
y -= alignY;
|
||||
SkPoint offset = SkPoint::Make(x, y);
|
||||
|
||||
DrawDFPosText(blob, runIndex, fontCache, props, skPaint, color, viewMatrix, text, byteLength,
|
||||
positions.begin(), 2, offset);
|
||||
DrawDFPosText(blob, runIndex, fontCache, props, skPaint, color, fakeGamma, viewMatrix,
|
||||
text, byteLength, positions.begin(), 2, offset);
|
||||
}
|
||||
|
||||
void GrTextUtils::DrawDFPosText(GrAtlasTextBlob* blob, int runIndex,
|
||||
GrBatchFontCache* fontCache, const SkSurfaceProps& props,
|
||||
const SkPaint& origPaint,
|
||||
GrColor color, const SkMatrix& viewMatrix,
|
||||
GrColor color, SkPaint::FakeGamma fakeGamma,
|
||||
const SkMatrix& viewMatrix,
|
||||
const char text[], size_t byteLength,
|
||||
const SkScalar pos[], int scalarsPerPosition,
|
||||
const SkPoint& offset) {
|
||||
@ -341,6 +344,8 @@ void GrTextUtils::DrawDFPosText(GrAtlasTextBlob* blob, int runIndex,
|
||||
|
||||
GrBatchTextStrike* currStrike = nullptr;
|
||||
|
||||
// We apply the fake-gamma by altering the distance in the shader, so we ignore the
|
||||
// fakeGamma parameter. (It's only used when we fall-back to bitmap text).
|
||||
SkGlyphCache* cache = blob->setupCache(runIndex, props, SkPaint::FakeGamma::Off,
|
||||
dfPaint, nullptr);
|
||||
SkPaint::GlyphCacheProc glyphCacheProc = dfPaint.getGlyphCacheProc(true);
|
||||
@ -415,7 +420,7 @@ void GrTextUtils::DrawDFPosText(GrAtlasTextBlob* blob, int runIndex,
|
||||
if (fallbackTxt.count()) {
|
||||
blob->initOverride(runIndex);
|
||||
GrTextUtils::DrawBmpPosText(blob, runIndex, fontCache, props,
|
||||
origPaint, origPaint.getColor(), viewMatrix,
|
||||
origPaint, origPaint.getColor(), fakeGamma, viewMatrix,
|
||||
fallbackTxt.begin(), fallbackTxt.count(),
|
||||
fallbackPos.begin(), scalarsPerPosition, offset);
|
||||
}
|
||||
|
@ -9,6 +9,7 @@
|
||||
#define GrTextUtils_DEFINED
|
||||
|
||||
#include "GrColor.h"
|
||||
#include "SkPaint.h"
|
||||
#include "SkScalar.h"
|
||||
|
||||
class GrAtlasTextBlob;
|
||||
@ -22,7 +23,6 @@ class GrShaderCaps;
|
||||
class SkGlyph;
|
||||
class SkMatrix;
|
||||
struct SkIRect;
|
||||
class SkPaint;
|
||||
struct SkPoint;
|
||||
class SkGlyphCache;
|
||||
class SkSurfaceProps;
|
||||
@ -38,13 +38,13 @@ public:
|
||||
static void DrawBmpText(GrAtlasTextBlob*, int runIndex,
|
||||
GrBatchFontCache*, const SkSurfaceProps&,
|
||||
const SkPaint&,
|
||||
GrColor, const SkMatrix& viewMatrix,
|
||||
GrColor, SkPaint::FakeGamma, const SkMatrix& viewMatrix,
|
||||
const char text[], size_t byteLength,
|
||||
SkScalar x, SkScalar y);
|
||||
|
||||
static void DrawBmpPosText(GrAtlasTextBlob*, int runIndex,
|
||||
GrBatchFontCache*, const SkSurfaceProps&, const SkPaint&,
|
||||
GrColor, const SkMatrix& viewMatrix,
|
||||
GrColor, SkPaint::FakeGamma, const SkMatrix& viewMatrix,
|
||||
const char text[], size_t byteLength,
|
||||
const SkScalar pos[], int scalarsPerPosition,
|
||||
const SkPoint& offset);
|
||||
@ -55,14 +55,14 @@ public:
|
||||
|
||||
static void DrawDFText(GrAtlasTextBlob* blob, int runIndex,
|
||||
GrBatchFontCache*, const SkSurfaceProps&,
|
||||
const SkPaint& skPaint, GrColor color,
|
||||
const SkPaint& skPaint, GrColor color, SkPaint::FakeGamma,
|
||||
const SkMatrix& viewMatrix,
|
||||
const char text[], size_t byteLength,
|
||||
SkScalar x, SkScalar y);
|
||||
|
||||
static void DrawDFPosText(GrAtlasTextBlob* blob, int runIndex,
|
||||
GrBatchFontCache*, const SkSurfaceProps&, const SkPaint&,
|
||||
GrColor color, const SkMatrix& viewMatrix,
|
||||
GrColor color, SkPaint::FakeGamma, const SkMatrix& viewMatrix,
|
||||
const char text[], size_t byteLength,
|
||||
const SkScalar pos[], int scalarsPerPosition,
|
||||
const SkPoint& offset);
|
||||
|
Loading…
Reference in New Issue
Block a user