blob: 2945b02152f07cf34952cd5f1c1f9c832a93c9e1 [file] [log] [blame]
joshualitt1d89e8d2015-04-01 12:40:54 -07001/*
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 "GrTextContext.h"
12
joshualitt374b2f72015-07-21 08:05:03 -070013#include "GrAtlasTextBlob.h"
joshualitt1d89e8d2015-04-01 12:40:54 -070014#include "GrGeometryProcessor.h"
joshualitt9a27e632015-04-06 10:53:36 -070015#include "SkTextBlob.h"
joshualitt1d89e8d2015-04-01 12:40:54 -070016
joshualitt79dfb2b2015-05-11 08:58:08 -070017#ifdef GR_TEST_UTILS
18#include "GrBatchTest.h"
19#endif
20
bsalomonabd30f52015-08-13 13:34:48 -070021class GrDrawBatch;
robertphillipsea461502015-05-26 11:38:03 -070022class GrDrawContext;
robertphillips2334fb62015-06-17 05:43:33 -070023class GrDrawTarget;
joshualitt1d89e8d2015-04-01 12:40:54 -070024class GrPipelineBuilder;
joshualittb7133be2015-04-08 09:08:31 -070025class GrTextBlobCache;
joshualitt6c2c2b02015-07-24 10:37:00 -070026class SkGlyph;
joshualitt1d89e8d2015-04-01 12:40:54 -070027
28/*
29 * This class implements GrTextContext using standard bitmap fonts, and can also process textblobs.
30 * TODO replace GrBitmapTextContext
31 */
joshualittdbd35932015-04-02 09:19:04 -070032class GrAtlasTextContext : public GrTextContext {
joshualitt1d89e8d2015-04-01 12:40:54 -070033public:
robertphillipsfcf78292015-06-19 11:49:52 -070034 static GrAtlasTextContext* Create(GrContext*, GrDrawContext*, const SkSurfaceProps&);
joshualitt1d89e8d2015-04-01 12:40:54 -070035
joshualitt1d89e8d2015-04-01 12:40:54 -070036private:
robertphillipsfcf78292015-06-19 11:49:52 -070037 GrAtlasTextContext(GrContext*, GrDrawContext*, const SkSurfaceProps&);
joshualitt9bd2daf2015-04-17 09:30:06 -070038 ~GrAtlasTextContext() override {}
joshualitt1d89e8d2015-04-01 12:40:54 -070039
40 bool canDraw(const GrRenderTarget*, const GrClip&, const GrPaint&,
41 const SkPaint&, const SkMatrix& viewMatrix) override;
42
robertphillips2334fb62015-06-17 05:43:33 -070043 void onDrawText(GrRenderTarget*, const GrClip&, const GrPaint&, const SkPaint&,
joshualitt1d89e8d2015-04-01 12:40:54 -070044 const SkMatrix& viewMatrix, const char text[], size_t byteLength,
45 SkScalar x, SkScalar y, const SkIRect& regionClipBounds) override;
robertphillips2334fb62015-06-17 05:43:33 -070046 void onDrawPosText(GrRenderTarget*, const GrClip&, const GrPaint&,
robertphillipsccb1b572015-05-27 11:02:55 -070047 const SkPaint&, const SkMatrix& viewMatrix,
joshualitt1d89e8d2015-04-01 12:40:54 -070048 const char text[], size_t byteLength,
49 const SkScalar pos[], int scalarsPerPosition,
50 const SkPoint& offset, const SkIRect& regionClipBounds) override;
robertphillips9c240a12015-05-28 07:45:59 -070051 void drawTextBlob(GrRenderTarget*, const GrClip&, const SkPaint&,
joshualitt1d89e8d2015-04-01 12:40:54 -070052 const SkMatrix& viewMatrix, const SkTextBlob*, SkScalar x, SkScalar y,
53 SkDrawFilter*, const SkIRect& clipBounds) override;
54
joshualitt374b2f72015-07-21 08:05:03 -070055 typedef GrAtlasTextBlob::Run Run;
joshualitt1d89e8d2015-04-01 12:40:54 -070056 typedef Run::SubRunInfo PerSubRunInfo;
57
joshualitt9bd2daf2015-04-17 09:30:06 -070058 inline bool canDrawAsDistanceFields(const SkPaint&, const SkMatrix& viewMatrix);
joshualitt374b2f72015-07-21 08:05:03 -070059 GrAtlasTextBlob* setupDFBlob(int glyphCount, const SkPaint& origPaint,
joshualitt9bd2daf2015-04-17 09:30:06 -070060 const SkMatrix& viewMatrix, SkGlyphCache** cache,
61 SkPaint* dfPaint, SkScalar* textRatio);
joshualitt6c2c2b02015-07-24 10:37:00 -070062 void bmpAppendGlyph(GrAtlasTextBlob*, int runIndex, const SkGlyph&, int left, int top,
joshualitt9bd2daf2015-04-17 09:30:06 -070063 GrColor color, GrFontScaler*, const SkIRect& clipRect);
joshualitt6c2c2b02015-07-24 10:37:00 -070064 bool dfAppendGlyph(GrAtlasTextBlob*, int runIndex, const SkGlyph&, SkScalar sx, SkScalar sy,
joshualitt9bd2daf2015-04-17 09:30:06 -070065 GrColor color, GrFontScaler*, const SkIRect& clipRect, SkScalar textRatio,
66 const SkMatrix& viewMatrix);
joshualitt6c2c2b02015-07-24 10:37:00 -070067 inline void appendGlyphPath(GrAtlasTextBlob*, GrGlyph*, GrFontScaler*, const SkGlyph&,
68 SkScalar x, SkScalar y);
joshualitt374b2f72015-07-21 08:05:03 -070069 inline void appendGlyphCommon(GrAtlasTextBlob*, Run*, Run::SubRunInfo*,
joshualitt9bd2daf2015-04-17 09:30:06 -070070 const SkRect& positions, GrColor color,
71 size_t vertexStride, bool useVertexColor,
joshualittae32c102015-04-21 09:37:57 -070072 GrGlyph*);
joshualitt9a27e632015-04-06 10:53:36 -070073
robertphillips2334fb62015-06-17 05:43:33 -070074 inline void flushRunAsPaths(GrRenderTarget*,
robertphillipsccb1b572015-05-27 11:02:55 -070075 const SkTextBlob::RunIterator&, const GrClip& clip,
76 const SkPaint&, SkDrawFilter*,
joshualitt9a27e632015-04-06 10:53:36 -070077 const SkMatrix& viewMatrix, const SkIRect& clipBounds, SkScalar x,
78 SkScalar y);
bsalomonabd30f52015-08-13 13:34:48 -070079 inline GrDrawBatch* createBatch(GrAtlasTextBlob*, const PerSubRunInfo&,
80 int glyphCount, int run, int subRun,
81 GrColor, SkScalar transX, SkScalar transY,
82 const SkPaint&);
joshualitt374b2f72015-07-21 08:05:03 -070083 inline void flushRun(GrPipelineBuilder*, GrAtlasTextBlob*, int run, GrColor,
joshualitt9bd2daf2015-04-17 09:30:06 -070084 SkScalar transX, SkScalar transY, const SkPaint&);
joshualitt374b2f72015-07-21 08:05:03 -070085 inline void flushBigGlyphs(GrAtlasTextBlob* cacheBlob, GrRenderTarget*,
robertphillipsccb1b572015-05-27 11:02:55 -070086 const GrClip& clip, const SkPaint& skPaint,
joshualitt1107e902015-05-11 14:52:11 -070087 SkScalar transX, SkScalar transY, const SkIRect& clipBounds);
joshualitt9a27e632015-04-06 10:53:36 -070088
89 // We have to flush SkTextBlobs differently from drawText / drawPosText
joshualitt374b2f72015-07-21 08:05:03 -070090 void flush(const SkTextBlob*, GrAtlasTextBlob*, GrRenderTarget*,
robertphillipsccb1b572015-05-27 11:02:55 -070091 const SkPaint&, const GrPaint&, SkDrawFilter*, const GrClip&,
92 const SkMatrix& viewMatrix, const SkIRect& clipBounds, SkScalar x, SkScalar y,
93 SkScalar transX, SkScalar transY);
joshualitt374b2f72015-07-21 08:05:03 -070094 void flush(GrAtlasTextBlob*, GrRenderTarget*, const SkPaint&,
joshualitt1107e902015-05-11 14:52:11 -070095 const GrPaint&, const GrClip&, const SkIRect& clipBounds);
joshualitt1d89e8d2015-04-01 12:40:54 -070096
joshualitt9bd2daf2015-04-17 09:30:06 -070097 // A helper for drawing BitmapText in a run of distance fields
joshualitt374b2f72015-07-21 08:05:03 -070098 inline void fallbackDrawPosText(GrAtlasTextBlob*, int runIndex,
joshualittfcfb9fc2015-04-21 07:35:10 -070099 GrRenderTarget*, const GrClip&,
joshualitt9bd2daf2015-04-17 09:30:06 -0700100 const GrPaint&,
101 const SkPaint&, const SkMatrix& viewMatrix,
102 const SkTDArray<char>& fallbackTxt,
103 const SkTDArray<SkScalar>& fallbackPos,
104 int scalarsPerPosition,
105 const SkPoint& offset,
106 const SkIRect& clipRect);
107
joshualitt374b2f72015-07-21 08:05:03 -0700108 void internalDrawBMPText(GrAtlasTextBlob*, int runIndex, SkGlyphCache*, const SkPaint&,
joshualitt9e36c1a2015-04-14 12:17:27 -0700109 GrColor color, const SkMatrix& viewMatrix,
joshualitt1d89e8d2015-04-01 12:40:54 -0700110 const char text[], size_t byteLength,
joshualitt9bd2daf2015-04-17 09:30:06 -0700111 SkScalar x, SkScalar y, const SkIRect& clipRect);
joshualitt374b2f72015-07-21 08:05:03 -0700112 void internalDrawBMPPosText(GrAtlasTextBlob*, int runIndex, SkGlyphCache*, const SkPaint&,
joshualitt9bd2daf2015-04-17 09:30:06 -0700113 GrColor color, const SkMatrix& viewMatrix,
114 const char text[], size_t byteLength,
115 const SkScalar pos[], int scalarsPerPosition,
116 const SkPoint& offset, const SkIRect& clipRect);
117
joshualitt374b2f72015-07-21 08:05:03 -0700118 void internalDrawDFText(GrAtlasTextBlob*, int runIndex, SkGlyphCache*, const SkPaint&,
joshualitt9bd2daf2015-04-17 09:30:06 -0700119 GrColor color, const SkMatrix& viewMatrix,
120 const char text[], size_t byteLength,
121 SkScalar x, SkScalar y, const SkIRect& clipRect,
122 SkScalar textRatio,
123 SkTDArray<char>* fallbackTxt,
124 SkTDArray<SkScalar>* fallbackPos,
125 SkPoint* offset, const SkPaint& origPaint);
joshualitt374b2f72015-07-21 08:05:03 -0700126 void internalDrawDFPosText(GrAtlasTextBlob*, int runIndex, SkGlyphCache*, const SkPaint&,
joshualitt9bd2daf2015-04-17 09:30:06 -0700127 GrColor color, const SkMatrix& viewMatrix,
128 const char text[], size_t byteLength,
129 const SkScalar pos[], int scalarsPerPosition,
130 const SkPoint& offset, const SkIRect& clipRect,
131 SkScalar textRatio,
132 SkTDArray<char>* fallbackTxt,
133 SkTDArray<SkScalar>* fallbackPos);
joshualitt1d89e8d2015-04-01 12:40:54 -0700134
135 // sets up the descriptor on the blob and returns a detached cache. Client must attach
joshualitt9e36c1a2015-04-14 12:17:27 -0700136 inline static GrColor ComputeCanonicalColor(const SkPaint&, bool lcd);
joshualitt9bd2daf2015-04-17 09:30:06 -0700137 inline SkGlyphCache* setupCache(Run*, const SkPaint&, const SkMatrix* viewMatrix, bool noGamma);
joshualitt2a0e9f32015-04-13 06:12:21 -0700138 static inline bool MustRegenerateBlob(SkScalar* outTransX, SkScalar* outTransY,
joshualitt374b2f72015-07-21 08:05:03 -0700139 const GrAtlasTextBlob&, const SkPaint&,
joshualitt53b5f442015-04-13 06:33:59 -0700140 const SkMaskFilter::BlurRec&,
joshualitt1d89e8d2015-04-01 12:40:54 -0700141 const SkMatrix& viewMatrix, SkScalar x, SkScalar y);
joshualitt374b2f72015-07-21 08:05:03 -0700142 void regenerateTextBlob(GrAtlasTextBlob* bmp, const SkPaint& skPaint, GrColor,
joshualitt9e36c1a2015-04-14 12:17:27 -0700143 const SkMatrix& viewMatrix,
joshualitt1d89e8d2015-04-01 12:40:54 -0700144 const SkTextBlob* blob, SkScalar x, SkScalar y,
joshualittfcfb9fc2015-04-21 07:35:10 -0700145 SkDrawFilter* drawFilter, const SkIRect& clipRect, GrRenderTarget*,
146 const GrClip&, const GrPaint&);
joshualitt9e36c1a2015-04-14 12:17:27 -0700147 inline static bool HasLCD(const SkTextBlob*);
joshualitt374b2f72015-07-21 08:05:03 -0700148 inline void initDistanceFieldPaint(GrAtlasTextBlob*, SkPaint*, SkScalar* textRatio,
joshualitt64c99cc2015-04-21 09:43:03 -0700149 const SkMatrix&);
joshualitt9bd2daf2015-04-17 09:30:06 -0700150
joshualitt79dfb2b2015-05-11 08:58:08 -0700151 // Test methods
152 // TODO this is really ugly. It'd be much nicer if positioning could be moved to batch
joshualitt374b2f72015-07-21 08:05:03 -0700153 inline GrAtlasTextBlob* createDrawTextBlob(GrRenderTarget*, const GrClip&, const GrPaint&,
joshualitt79dfb2b2015-05-11 08:58:08 -0700154 const SkPaint&, const SkMatrix& viewMatrix,
155 const char text[], size_t byteLength,
156 SkScalar x, SkScalar y,
157 const SkIRect& regionClipBounds);
joshualitt374b2f72015-07-21 08:05:03 -0700158 inline GrAtlasTextBlob* createDrawPosTextBlob(GrRenderTarget*, const GrClip&, const GrPaint&,
joshualitt79dfb2b2015-05-11 08:58:08 -0700159 const SkPaint&, const SkMatrix& viewMatrix,
160 const char text[], size_t byteLength,
161 const SkScalar pos[], int scalarsPerPosition,
162 const SkPoint& offset,
163 const SkIRect& regionClipBounds);
164
joshualitt9bd2daf2015-04-17 09:30:06 -0700165 // Distance field text needs this table to compute a value for use in the fragment shader.
166 // Because the GrAtlasTextContext can go out of scope before the final flush, this needs to be
167 // refcnted and malloced
168 struct DistanceAdjustTable : public SkNVRefCnt<DistanceAdjustTable> {
robertphillips9fc82752015-06-19 04:46:45 -0700169 DistanceAdjustTable() { this->buildDistanceAdjustTable(); }
joshualitt9bd2daf2015-04-17 09:30:06 -0700170 ~DistanceAdjustTable() { SkDELETE_ARRAY(fTable); }
171
joshualitt9bd2daf2015-04-17 09:30:06 -0700172 const SkScalar& operator[] (int i) const {
173 return fTable[i];
174 }
175
robertphillips9fc82752015-06-19 04:46:45 -0700176 private:
177 void buildDistanceAdjustTable();
178
joshualitt9bd2daf2015-04-17 09:30:06 -0700179 SkScalar* fTable;
180 };
joshualitt1d89e8d2015-04-01 12:40:54 -0700181
joshualitt1d89e8d2015-04-01 12:40:54 -0700182 GrBatchTextStrike* fCurrStrike;
joshualittb7133be2015-04-08 09:08:31 -0700183 GrTextBlobCache* fCache;
joshualitt9bd2daf2015-04-17 09:30:06 -0700184 SkAutoTUnref<DistanceAdjustTable> fDistanceAdjustTable;
joshualitt1d89e8d2015-04-01 12:40:54 -0700185
joshualittb7133be2015-04-08 09:08:31 -0700186 friend class GrTextBlobCache;
bsalomon265697d2015-07-22 10:17:26 -0700187 friend class TextBatch;
joshualitt1d89e8d2015-04-01 12:40:54 -0700188
joshualitt79dfb2b2015-05-11 08:58:08 -0700189#ifdef GR_TEST_UTILS
bsalomonabd30f52015-08-13 13:34:48 -0700190 DRAW_BATCH_TEST_FRIEND(TextBlobBatch);
joshualitt79dfb2b2015-05-11 08:58:08 -0700191#endif
192
joshualitt1d89e8d2015-04-01 12:40:54 -0700193 typedef GrTextContext INHERITED;
194};
195
196#endif