| Index: src/gpu/GrAtlasTextContext.h
|
| diff --git a/src/gpu/GrAtlasTextContext.h b/src/gpu/GrAtlasTextContext.h
|
| index 79cb7a4169da545ebdf3128dc45006b0316412c2..6fd35538f67750f906d795a6f8db6e2c69226978 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;
|
|
|