diff options
author | Jim Van Verth <jvanverth@google.com> | 2017-07-06 16:36:55 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-07-06 21:24:17 +0000 |
commit | 90e89b366a7dc90111c861ba76c492ce1743a0d1 (patch) | |
tree | fe2c43e52dc3d811669b107f5124c39c4acb0e72 /src/gpu/text | |
parent | 24a2ecfa256042efd57fd97b23dbce5a49b92a94 (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.cpp | 2 | ||||
-rw-r--r-- | src/gpu/text/GrAtlasTextBlob.h | 32 | ||||
-rw-r--r-- | src/gpu/text/GrTextUtils.cpp | 4 |
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; |