aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/text
diff options
context:
space:
mode:
authorGravatar Jim Van Verth <jvanverth@google.com>2017-07-06 16:36:55 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-07-06 21:24:17 +0000
commit90e89b366a7dc90111c861ba76c492ce1743a0d1 (patch)
treefe2c43e52dc3d811669b107f5124c39c4acb0e72 /src/gpu/text
parent24a2ecfa256042efd57fd97b23dbce5a49b92a94 (diff)
Add proper aliased support for SDF text
Previously, when asked to render aliased text with distance fields, we would get the aliased glyph from the cache and then try to anti-alias the edge. This change instead grabs the anti-aliased glyph, then deliberately aliases the edge. Bug: chromium:707979 Change-Id: I05766af17d7ae58bca27aaffd9e08e5c586e789c Reviewed-on: https://skia-review.googlesource.com/21728 Commit-Queue: Jim Van Verth <jvanverth@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com>
Diffstat (limited to 'src/gpu/text')
-rw-r--r--src/gpu/text/GrAtlasTextBlob.cpp2
-rw-r--r--src/gpu/text/GrAtlasTextBlob.h32
-rw-r--r--src/gpu/text/GrTextUtils.cpp4
3 files changed, 25 insertions, 13 deletions
diff --git a/src/gpu/text/GrAtlasTextBlob.cpp b/src/gpu/text/GrAtlasTextBlob.cpp
index a68f6f9cfa..10b1c81639 100644
--- a/src/gpu/text/GrAtlasTextBlob.cpp
+++ b/src/gpu/text/GrAtlasTextBlob.cpp
@@ -270,7 +270,7 @@ inline std::unique_ptr<GrLegacyMeshDrawOp> GrAtlasTextBlob::makeOp(
bool useBGR = SkPixelGeometryIsBGR(props.pixelGeometry());
op = GrAtlasTextOp::MakeDistanceField(glyphCount, cache, distanceAdjustTable,
useGammaCorrectDistanceTable, luminanceColor,
- info.hasUseLCDText(), useBGR);
+ info.hasUseLCDText(), useBGR, info.isAntiAliased());
} else {
op = GrAtlasTextOp::MakeBitmap(format, glyphCount, cache);
}
diff --git a/src/gpu/text/GrAtlasTextBlob.h b/src/gpu/text/GrAtlasTextBlob.h
index 470d26f457..12fe68b948 100644
--- a/src/gpu/text/GrAtlasTextBlob.h
+++ b/src/gpu/text/GrAtlasTextBlob.h
@@ -126,10 +126,11 @@ public:
}
// sets the last subrun of runIndex to use distance field text
- void setSubRunHasDistanceFields(int runIndex, bool hasLCD) {
+ void setSubRunHasDistanceFields(int runIndex, bool hasLCD, bool isAntiAlias) {
Run& run = fRuns[runIndex];
Run::SubRunInfo& subRun = run.fSubRunInfo.back();
subRun.setUseLCDText(hasLCD);
+ subRun.setAntiAliased(isAntiAlias);
subRun.setDrawAsDistanceFields();
}
@@ -358,8 +359,7 @@ private:
, fGlyphEndIndex(0)
, fColor(GrColor_ILLEGAL)
, fMaskFormat(kA8_GrMaskFormat)
- , fDrawAsDistanceFields(false)
- , fUseLCDText(false) {
+ , fFlags(0) {
fVertexBounds.setLargestInverted();
}
SubRunInfo(const SubRunInfo& that)
@@ -376,8 +376,7 @@ private:
, fY(that.fY)
, fColor(that.fColor)
, fMaskFormat(that.fMaskFormat)
- , fDrawAsDistanceFields(that.fDrawAsDistanceFields)
- , fUseLCDText(that.fUseLCDText) {
+ , fFlags(that.fFlags) {
}
// TODO when this object is more internal, drop the privacy
@@ -432,12 +431,24 @@ private:
SkScalar*transX, SkScalar* transY);
// df properties
- void setUseLCDText(bool useLCDText) { fUseLCDText = useLCDText; }
- bool hasUseLCDText() const { return fUseLCDText; }
- void setDrawAsDistanceFields() { fDrawAsDistanceFields = true; }
- bool drawAsDistanceFields() const { return fDrawAsDistanceFields; }
+ void setDrawAsDistanceFields() { fFlags |= kDrawAsSDF_Flag; }
+ bool drawAsDistanceFields() const { return SkToBool(fFlags & kDrawAsSDF_Flag); }
+ void setUseLCDText(bool useLCDText) {
+ fFlags = useLCDText ? fFlags | kUseLCDText_Flag : fFlags & ~kUseLCDText_Flag;
+ }
+ bool hasUseLCDText() const { return SkToBool(fFlags & kUseLCDText_Flag); }
+ void setAntiAliased(bool antiAliased) {
+ fFlags = antiAliased ? fFlags | kAntiAliased_Flag : fFlags & ~kAntiAliased_Flag;
+ }
+ bool isAntiAliased() const { return SkToBool(fFlags & kAntiAliased_Flag); }
private:
+ enum Flag {
+ kDrawAsSDF_Flag = 0x1,
+ kUseLCDText_Flag = 0x2,
+ kAntiAliased_Flag = 0x4
+ };
+
GrDrawOpAtlas::BulkUseTokenUpdater fBulkUseToken;
sk_sp<GrAtlasTextStrike> fStrike;
SkMatrix fCurrentViewMatrix;
@@ -451,8 +462,7 @@ private:
SkScalar fY;
GrColor fColor;
GrMaskFormat fMaskFormat;
- bool fDrawAsDistanceFields; // df property
- bool fUseLCDText; // df property
+ uint32_t fFlags;
};
SubRunInfo& push_back() {
diff --git a/src/gpu/text/GrTextUtils.cpp b/src/gpu/text/GrTextUtils.cpp
index 20d5aaf338..7ef7eb8587 100644
--- a/src/gpu/text/GrTextUtils.cpp
+++ b/src/gpu/text/GrTextUtils.cpp
@@ -283,6 +283,7 @@ void GrTextUtils::InitDistanceFieldPaint(GrAtlasTextBlob* blob,
SkASSERT(dfMaskScaleFloor <= scaledTextSize && scaledTextSize <= dfMaskScaleCeil);
blob->setMinAndMaxScale(dfMaskScaleFloor / scaledTextSize, dfMaskScaleCeil / scaledTextSize);
+ skPaint->setAntiAlias(true);
skPaint->setLCDRenderText(false);
skPaint->setAutohinted(false);
skPaint->setHinting(SkPaint::kNormal_Hinting);
@@ -386,7 +387,8 @@ void GrTextUtils::DrawDFPosText(GrAtlasTextBlob* blob, int runIndex, GrAtlasGlyp
SkPaint dfPaint(paint);
GrTextUtils::InitDistanceFieldPaint(blob, &dfPaint, &textRatio, viewMatrix);
blob->setHasDistanceField();
- blob->setSubRunHasDistanceFields(runIndex, paint.skPaint().isLCDRenderText());
+ blob->setSubRunHasDistanceFields(runIndex, paint.skPaint().isLCDRenderText(),
+ paint.skPaint().isAntiAlias());
GrAtlasTextStrike* currStrike = nullptr;