diff options
author | 2015-04-17 09:30:06 -0700 | |
---|---|---|
committer | 2015-04-17 09:30:07 -0700 | |
commit | 9bd2daff8e53a6f02c7e5d1e6aa330f89b8542a3 (patch) | |
tree | 044ad59bb3121ce15209054553721bfca4c0019c /src/gpu/GrAtlasTextContext.h | |
parent | 523ed6c0c1ac9029be315542258e02ba9854365c (diff) |
Initial CL to add distance field support to GrAtlasTextContext
BUG=skia:
Review URL: https://codereview.chromium.org/1082843002
Diffstat (limited to 'src/gpu/GrAtlasTextContext.h')
-rw-r--r-- | src/gpu/GrAtlasTextContext.h | 101 |
1 files changed, 86 insertions, 15 deletions
diff --git a/src/gpu/GrAtlasTextContext.h b/src/gpu/GrAtlasTextContext.h index 79cb7a4169..6fd35538f6 100644 --- a/src/gpu/GrAtlasTextContext.h +++ b/src/gpu/GrAtlasTextContext.h @@ -28,10 +28,13 @@ class GrTextBlobCache; */ class GrAtlasTextContext : public GrTextContext { public: - static GrAtlasTextContext* Create(GrContext*, SkGpuDevice*, const SkDeviceProperties&); + static GrAtlasTextContext* Create(GrContext*, SkGpuDevice*, const SkDeviceProperties&, + bool enableDistanceFields); private: - GrAtlasTextContext(GrContext*, SkGpuDevice*, const SkDeviceProperties&); + GrAtlasTextContext(GrContext*, SkGpuDevice*, const SkDeviceProperties&, + bool enableDistanceFields); + ~GrAtlasTextContext() override {} bool canDraw(const GrRenderTarget*, const GrClip&, const GrPaint&, const SkPaint&, const SkMatrix& viewMatrix) override; @@ -98,7 +101,8 @@ private: , fGlyphStartIndex(0) , fGlyphEndIndex(0) , fVertexStartIndex(0) - , fVertexEndIndex(0) {} + , fVertexEndIndex(0) + , fDrawAsDistanceFields(false) {} GrMaskFormat fMaskFormat; uint64_t fAtlasGeneration; uint32_t fGlyphStartIndex; @@ -106,6 +110,10 @@ private: size_t fVertexStartIndex; size_t fVertexEndIndex; GrBatchAtlas::BulkUseTokenUpdater fBulkUseToken; + + // distance field properties + bool fDrawAsDistanceFields; + bool fUseLCDText; }; class SubRunInfoArray { @@ -227,14 +235,27 @@ private: typedef BitmapTextBlob::Run Run; typedef Run::SubRunInfo PerSubRunInfo; - void appendGlyph(BitmapTextBlob*, int runIndex, GrGlyph::PackedID, int left, int top, - GrColor color, GrFontScaler*, const SkIRect& clipRect); + inline bool canDrawAsDistanceFields(const SkPaint&, const SkMatrix& viewMatrix); + BitmapTextBlob* setupDFBlob(int glyphCount, const SkPaint& origPaint, + const SkMatrix& viewMatrix, SkGlyphCache** cache, + SkPaint* dfPaint, SkScalar* textRatio); + void bmpAppendGlyph(BitmapTextBlob*, int runIndex, GrGlyph::PackedID, int left, int top, + GrColor color, GrFontScaler*, const SkIRect& clipRect); + bool dfAppendGlyph(BitmapTextBlob*, int runIndex, GrGlyph::PackedID, SkScalar sx, SkScalar sy, + GrColor color, GrFontScaler*, const SkIRect& clipRect, SkScalar textRatio, + const SkMatrix& viewMatrix); + inline void appendGlyphPath(BitmapTextBlob* blob, GrGlyph* glyph, + GrFontScaler* scaler, int x, int y); + inline void appendGlyphCommon(BitmapTextBlob*, Run*, Run::SubRunInfo*, + const SkRect& positions, GrColor color, + size_t vertexStride, bool useVertexColor, + GrGlyph::PackedID); inline void flushRunAsPaths(const SkTextBlob::RunIterator&, const SkPaint&, SkDrawFilter*, const SkMatrix& viewMatrix, const SkIRect& clipBounds, SkScalar x, SkScalar y); inline void flushRun(GrDrawTarget*, GrPipelineBuilder*, BitmapTextBlob*, int run, GrColor, - uint8_t paintAlpha, SkScalar transX, SkScalar transY); + SkScalar transX, SkScalar transY, const SkPaint&); inline void flushBigGlyphs(BitmapTextBlob* cacheBlob, GrRenderTarget* rt, const GrPaint& grPaint, const GrClip& clip, SkScalar transX, SkScalar transY); @@ -244,21 +265,48 @@ private: const GrPaint&, SkDrawFilter*, const GrClip&, const SkMatrix& viewMatrix, const SkIRect& clipBounds, SkScalar x, SkScalar y, SkScalar transX, SkScalar transY); void flush(GrDrawTarget*, BitmapTextBlob*, GrRenderTarget*, const SkPaint&, - const GrPaint&, const GrClip&, const SkMatrix& viewMatrix); + const GrPaint&, const GrClip&); + + // A helper for drawing BitmapText in a run of distance fields + inline void fallbackDrawPosText(GrRenderTarget*, const GrClip&, + const GrPaint&, + const SkPaint&, const SkMatrix& viewMatrix, + const SkTDArray<char>& fallbackTxt, + const SkTDArray<SkScalar>& fallbackPos, + int scalarsPerPosition, + const SkPoint& offset, + const SkIRect& clipRect); - void internalDrawText(BitmapTextBlob*, int runIndex, SkGlyphCache*, const SkPaint&, - GrColor color, const SkMatrix& viewMatrix, - const char text[], size_t byteLength, - SkScalar x, SkScalar y, const SkIRect& clipRect); - void internalDrawPosText(BitmapTextBlob*, int runIndex, SkGlyphCache*, const SkPaint&, + void internalDrawBMPText(BitmapTextBlob*, int runIndex, SkGlyphCache*, const SkPaint&, GrColor color, const SkMatrix& viewMatrix, const char text[], size_t byteLength, - const SkScalar pos[], int scalarsPerPosition, - const SkPoint& offset, const SkIRect& clipRect); + SkScalar x, SkScalar y, const SkIRect& clipRect); + void internalDrawBMPPosText(BitmapTextBlob*, int runIndex, SkGlyphCache*, const SkPaint&, + GrColor color, const SkMatrix& viewMatrix, + const char text[], size_t byteLength, + const SkScalar pos[], int scalarsPerPosition, + const SkPoint& offset, const SkIRect& clipRect); + + void internalDrawDFText(BitmapTextBlob*, int runIndex, SkGlyphCache*, const SkPaint&, + GrColor color, const SkMatrix& viewMatrix, + const char text[], size_t byteLength, + SkScalar x, SkScalar y, const SkIRect& clipRect, + SkScalar textRatio, + SkTDArray<char>* fallbackTxt, + SkTDArray<SkScalar>* fallbackPos, + SkPoint* offset, const SkPaint& origPaint); + void internalDrawDFPosText(BitmapTextBlob*, int runIndex, SkGlyphCache*, const SkPaint&, + GrColor color, const SkMatrix& viewMatrix, + const char text[], size_t byteLength, + const SkScalar pos[], int scalarsPerPosition, + const SkPoint& offset, const SkIRect& clipRect, + SkScalar textRatio, + SkTDArray<char>* fallbackTxt, + SkTDArray<SkScalar>* fallbackPos); // sets up the descriptor on the blob and returns a detached cache. Client must attach inline static GrColor ComputeCanonicalColor(const SkPaint&, bool lcd); - inline SkGlyphCache* setupCache(Run*, const SkPaint&, const SkMatrix& viewMatrix); + inline SkGlyphCache* setupCache(Run*, const SkPaint&, const SkMatrix* viewMatrix, bool noGamma); static inline bool MustRegenerateBlob(SkScalar* outTransX, SkScalar* outTransY, const BitmapTextBlob&, const SkPaint&, const SkMaskFilter::BlurRec&, @@ -268,9 +316,32 @@ private: const SkTextBlob* blob, SkScalar x, SkScalar y, SkDrawFilter* drawFilter, const SkIRect& clipRect); inline static bool HasLCD(const SkTextBlob*); + inline void initDistanceFieldPaint(SkPaint*, SkScalar* textRatio, const SkMatrix&); + + // Distance field text needs this table to compute a value for use in the fragment shader. + // Because the GrAtlasTextContext can go out of scope before the final flush, this needs to be + // refcnted and malloced + struct DistanceAdjustTable : public SkNVRefCnt<DistanceAdjustTable> { + DistanceAdjustTable(float gamma) { this->buildDistanceAdjustTable(gamma); } + ~DistanceAdjustTable() { SkDELETE_ARRAY(fTable); } + + void buildDistanceAdjustTable(float gamma); + + SkScalar& operator[] (int i) { + return fTable[i]; + } + + const SkScalar& operator[] (int i) const { + return fTable[i]; + } + + SkScalar* fTable; + }; GrBatchTextStrike* fCurrStrike; GrTextBlobCache* fCache; + bool fEnableDFRendering; + SkAutoTUnref<DistanceAdjustTable> fDistanceAdjustTable; friend class GrTextBlobCache; friend class BitmapTextBatch; |