• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2015 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef GrAtlasTextContext_DEFINED
9 #define GrAtlasTextContext_DEFINED
10 
11 #include "GrAtlasTextBlob.h"
12 #include "GrDistanceFieldAdjustTable.h"
13 #include "GrGeometryProcessor.h"
14 #include "GrTextUtils.h"
15 #include "SkTextBlobRunIterator.h"
16 
17 #if GR_TEST_UTILS
18 #include "GrDrawOpTest.h"
19 #endif
20 
21 class GrDrawOp;
22 class GrTextBlobCache;
23 class SkGlyph;
24 
25 /*
26  * Renders text using some kind of an atlas, ie BitmapText or DistanceField text
27  */
28 class GrAtlasTextContext {
29 public:
30     struct Options {
31         /**
32          * Below this size (in device space) distance field text will not be used. Negative means
33          * use a default value.
34          */
35         SkScalar fMinDistanceFieldFontSize = -1.f;
36         /**
37          * Above this size (in device space) distance field text will not be used and glyphs will
38          * be rendered from outline as individual paths. Negative means use a default value.
39          */
40         SkScalar fMaxDistanceFieldFontSize = -1.f;
41         /** Forces all distance field vertices to use 3 components, not just when in perspective. */
42         bool fDistanceFieldVerticesAlwaysHaveW = false;
43     };
44 
45     static std::unique_ptr<GrAtlasTextContext> Make(const Options& options);
46 
47     bool canDraw(const GrAtlasGlyphCache* fontCache, const SkPaint&, const SkMatrix& viewMatrix,
48                  const SkSurfaceProps&, const GrShaderCaps&);
49 
50     void drawText(GrContext*, GrTextUtils::Target*, const GrClip&, const SkPaint&,
51                   const SkMatrix& viewMatrix, const SkSurfaceProps&, const char text[],
52                   size_t byteLength, SkScalar x, SkScalar y, const SkIRect& regionClipBounds);
53     void drawPosText(GrContext*, GrTextUtils::Target*, const GrClip&, const SkPaint&,
54                      const SkMatrix& viewMatrix, const SkSurfaceProps&, const char text[],
55                      size_t byteLength, const SkScalar pos[], int scalarsPerPosition,
56                      const SkPoint& offset, const SkIRect& regionClipBounds);
57     void drawTextBlob(GrContext*, GrTextUtils::Target*, const GrClip&, const SkPaint&,
58                       const SkMatrix& viewMatrix, const SkSurfaceProps&, const SkTextBlob*,
59                       SkScalar x, SkScalar y, SkDrawFilter*, const SkIRect& clipBounds);
60 
61 private:
62     GrAtlasTextContext(const Options& options);
63 
64     // sets up the descriptor on the blob and returns a detached cache.  Client must attach
65     static SkColor ComputeCanonicalColor(const SkPaint&, bool lcd);
66     // Determines if we need to use fake gamma (and contrast boost):
67     static SkScalerContextFlags ComputeScalerContextFlags(const GrColorSpaceInfo&);
68     void regenerateTextBlob(GrAtlasTextBlob* bmp,
69                             GrAtlasGlyphCache*,
70                             const GrShaderCaps&,
71                             const GrTextUtils::Paint&,
72                             SkScalerContextFlags scalerContextFlags,
73                             const SkMatrix& viewMatrix,
74                             const SkSurfaceProps&,
75                             const SkTextBlob* blob, SkScalar x, SkScalar y,
76                             SkDrawFilter* drawFilter) const;
77 
78     static bool HasLCD(const SkTextBlob*);
79 
80     sk_sp<GrAtlasTextBlob> makeDrawTextBlob(GrTextBlobCache*, GrAtlasGlyphCache*,
81                                             const GrShaderCaps&,
82                                             const GrTextUtils::Paint&,
83                                             SkScalerContextFlags scalerContextFlags,
84                                             const SkMatrix& viewMatrix,
85                                             const SkSurfaceProps&,
86                                             const char text[], size_t byteLength,
87                                             SkScalar x, SkScalar y) const;
88 
89     sk_sp<GrAtlasTextBlob> makeDrawPosTextBlob(GrTextBlobCache*, GrAtlasGlyphCache*,
90                                                const GrShaderCaps&,
91                                                const GrTextUtils::Paint&,
92                                                SkScalerContextFlags scalerContextFlags,
93                                                const SkMatrix& viewMatrix,
94                                                const SkSurfaceProps&,
95                                                const char text[], size_t byteLength,
96                                                const SkScalar pos[],
97                                                int scalarsPerPosition,
98                                                const SkPoint& offset) const;
99 
100     // Functions for appending BMP text to GrAtlasTextBlob
101     static void DrawBmpText(GrAtlasTextBlob*, int runIndex, GrAtlasGlyphCache*,
102                             const SkSurfaceProps&, const GrTextUtils::Paint& paint,
103                             SkScalerContextFlags scalerContextFlags, const SkMatrix& viewMatrix,
104                             const char text[], size_t byteLength, SkScalar x, SkScalar y);
105 
106     static void DrawBmpPosText(GrAtlasTextBlob*, int runIndex, GrAtlasGlyphCache*,
107                                const SkSurfaceProps&, const GrTextUtils::Paint& paint,
108                                SkScalerContextFlags scalerContextFlags, const SkMatrix& viewMatrix,
109                                const char text[], size_t byteLength, const SkScalar pos[],
110                                int scalarsPerPosition, const SkPoint& offset,
111                                SkScalar textRatio);
112 
113     // functions for appending distance field text
114     bool canDrawAsDistanceFields(const SkPaint& skPaint, const SkMatrix& viewMatrix,
115                                  const SkSurfaceProps& props, const GrShaderCaps& caps) const;
116 
117     void drawDFText(GrAtlasTextBlob* blob, int runIndex, GrAtlasGlyphCache*, const SkSurfaceProps&,
118                     const GrTextUtils::Paint& paint, SkScalerContextFlags scalerContextFlags,
119                     const SkMatrix& viewMatrix, const char text[], size_t byteLength, SkScalar x,
120                     SkScalar y) const;
121 
122     void drawDFPosText(GrAtlasTextBlob* blob, int runIndex, GrAtlasGlyphCache*,
123                        const SkSurfaceProps&, const GrTextUtils::Paint& paint,
124                        SkScalerContextFlags scalerContextFlags,
125                        const SkMatrix& viewMatrix, const char text[],
126                        size_t byteLength, const SkScalar pos[], int scalarsPerPosition,
127                        const SkPoint& offset) const;
128 
129     void initDistanceFieldPaint(GrAtlasTextBlob* blob,
130                                 SkPaint* skPaint,
131                                 SkScalar* textRatio,
132                                 const SkMatrix& viewMatrix) const;
133 
134     static void BmpAppendGlyph(GrAtlasTextBlob*, int runIndex, GrAtlasGlyphCache*,
135                                GrAtlasTextStrike**, const SkGlyph&, SkScalar sx, SkScalar sy,
136                                GrColor color, SkGlyphCache*, SkScalar textRatio);
137 
138     static void DfAppendGlyph(GrAtlasTextBlob*, int runIndex, GrAtlasGlyphCache*,
139                               GrAtlasTextStrike**, const SkGlyph&, SkScalar sx, SkScalar sy,
140                               GrColor color, SkGlyphCache* cache, SkScalar textRatio);
141 
dfAdjustTable()142     const GrDistanceFieldAdjustTable* dfAdjustTable() const { return fDistanceAdjustTable.get(); }
143 
144     sk_sp<const GrDistanceFieldAdjustTable> fDistanceAdjustTable;
145 
146     SkScalar fMinDistanceFieldFontSize;
147     SkScalar fMaxDistanceFieldFontSize;
148     bool fDistanceFieldVerticesAlwaysHaveW;
149 
150 #if GR_TEST_UTILS
151     static const SkScalerContextFlags kTextBlobOpScalerContextFlags =
152             SkScalerContextFlags::kFakeGammaAndBoostContrast;
153     GR_DRAW_OP_TEST_FRIEND(GrAtlasTextOp);
154 #endif
155 };
156 
157 #endif
158