blob: 82283bcf2413e0ed7b18ab29fb8f76dccbba49cb [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"
joshualitt1acabf32015-12-10 09:10:10 -080014#include "GrDistanceFieldAdjustTable.h"
joshualitt1d89e8d2015-04-01 12:40:54 -070015#include "GrGeometryProcessor.h"
halcanary33779752015-10-27 14:01:05 -070016#include "SkTextBlobRunIterator.h"
joshualitt1d89e8d2015-04-01 12:40:54 -070017
joshualitt79dfb2b2015-05-11 08:58:08 -070018#ifdef GR_TEST_UTILS
19#include "GrBatchTest.h"
20#endif
21
bsalomonabd30f52015-08-13 13:34:48 -070022class GrDrawBatch;
robertphillipsea461502015-05-26 11:38:03 -070023class GrDrawContext;
robertphillips2334fb62015-06-17 05:43:33 -070024class GrDrawTarget;
joshualitt1d89e8d2015-04-01 12:40:54 -070025class GrPipelineBuilder;
joshualittb7133be2015-04-08 09:08:31 -070026class GrTextBlobCache;
joshualitt6c2c2b02015-07-24 10:37:00 -070027class SkGlyph;
joshualitt1d89e8d2015-04-01 12:40:54 -070028
29/*
30 * This class implements GrTextContext using standard bitmap fonts, and can also process textblobs.
joshualitt1d89e8d2015-04-01 12:40:54 -070031 */
joshualittdbd35932015-04-02 09:19:04 -070032class GrAtlasTextContext : public GrTextContext {
joshualitt1d89e8d2015-04-01 12:40:54 -070033public:
robertphillipsf6703fa2015-09-01 05:36:47 -070034 static GrAtlasTextContext* Create(GrContext*, const SkSurfaceProps&);
joshualitt1d89e8d2015-04-01 12:40:54 -070035
joshualitt1d89e8d2015-04-01 12:40:54 -070036private:
robertphillipsf6703fa2015-09-01 05:36:47 -070037 GrAtlasTextContext(GrContext*, const SkSurfaceProps&);
joshualitt9bd2daf2015-04-17 09:30:06 -070038 ~GrAtlasTextContext() override {}
joshualitt1d89e8d2015-04-01 12:40:54 -070039
robertphillips6ee690e2015-12-02 08:57:50 -080040 bool canDraw(const SkPaint&, const SkMatrix& viewMatrix) override;
joshualitt1d89e8d2015-04-01 12:40:54 -070041
robertphillips433625e2015-12-04 06:58:16 -080042 void onDrawText(GrDrawContext*, const GrClip&, const GrPaint&, const SkPaint&,
joshualitt1d89e8d2015-04-01 12:40:54 -070043 const SkMatrix& viewMatrix, const char text[], size_t byteLength,
44 SkScalar x, SkScalar y, const SkIRect& regionClipBounds) override;
robertphillips433625e2015-12-04 06:58:16 -080045 void onDrawPosText(GrDrawContext*, const GrClip&, const GrPaint&,
robertphillipsccb1b572015-05-27 11:02:55 -070046 const SkPaint&, const SkMatrix& viewMatrix,
joshualitt1d89e8d2015-04-01 12:40:54 -070047 const char text[], size_t byteLength,
48 const SkScalar pos[], int scalarsPerPosition,
49 const SkPoint& offset, const SkIRect& regionClipBounds) override;
robertphillips433625e2015-12-04 06:58:16 -080050 void drawTextBlob(GrDrawContext*, const GrClip&, const SkPaint&,
joshualitt1d89e8d2015-04-01 12:40:54 -070051 const SkMatrix& viewMatrix, const SkTextBlob*, SkScalar x, SkScalar y,
52 SkDrawFilter*, const SkIRect& clipBounds) override;
53
joshualitt374b2f72015-07-21 08:05:03 -070054 typedef GrAtlasTextBlob::Run Run;
joshualitt1d89e8d2015-04-01 12:40:54 -070055 typedef Run::SubRunInfo PerSubRunInfo;
56
joshualitt9bd2daf2015-04-17 09:30:06 -070057 inline bool canDrawAsDistanceFields(const SkPaint&, const SkMatrix& viewMatrix);
joshualitt374b2f72015-07-21 08:05:03 -070058 GrAtlasTextBlob* setupDFBlob(int glyphCount, const SkPaint& origPaint,
jvanverth157e6482015-09-09 08:05:12 -070059 const SkMatrix& viewMatrix, SkPaint* dfPaint,
60 SkScalar* textRatio);
joshualitt6c2c2b02015-07-24 10:37:00 -070061 void bmpAppendGlyph(GrAtlasTextBlob*, int runIndex, const SkGlyph&, int left, int top,
robertphillips6ee690e2015-12-02 08:57:50 -080062 GrColor color, GrFontScaler*);
joshualitt6c2c2b02015-07-24 10:37:00 -070063 bool dfAppendGlyph(GrAtlasTextBlob*, int runIndex, const SkGlyph&, SkScalar sx, SkScalar sy,
robertphillips6ee690e2015-12-02 08:57:50 -080064 GrColor color, GrFontScaler*, SkScalar textRatio,
joshualitt9bd2daf2015-04-17 09:30:06 -070065 const SkMatrix& viewMatrix);
joshualitt9a27e632015-04-06 10:53:36 -070066
robertphillips7bceedc2015-12-01 12:51:26 -080067 inline void flushRunAsPaths(GrDrawContext*,
halcanary33779752015-10-27 14:01:05 -070068 const SkTextBlobRunIterator&, const GrClip& clip,
robertphillipsccb1b572015-05-27 11:02:55 -070069 const SkPaint&, SkDrawFilter*,
joshualitt9a27e632015-04-06 10:53:36 -070070 const SkMatrix& viewMatrix, const SkIRect& clipBounds, SkScalar x,
71 SkScalar y);
bsalomonabd30f52015-08-13 13:34:48 -070072 inline GrDrawBatch* createBatch(GrAtlasTextBlob*, const PerSubRunInfo&,
73 int glyphCount, int run, int subRun,
74 GrColor, SkScalar transX, SkScalar transY,
75 const SkPaint&);
robertphillipsf6703fa2015-09-01 05:36:47 -070076 inline void flushRun(GrDrawContext*, GrPipelineBuilder*, GrAtlasTextBlob*, int run, GrColor,
joshualitt9bd2daf2015-04-17 09:30:06 -070077 SkScalar transX, SkScalar transY, const SkPaint&);
robertphillips7bceedc2015-12-01 12:51:26 -080078 inline void flushBigGlyphs(GrAtlasTextBlob* cacheBlob, GrDrawContext*,
robertphillipsccb1b572015-05-27 11:02:55 -070079 const GrClip& clip, const SkPaint& skPaint,
joshualitt1107e902015-05-11 14:52:11 -070080 SkScalar transX, SkScalar transY, const SkIRect& clipBounds);
joshualitt9a27e632015-04-06 10:53:36 -070081
82 // We have to flush SkTextBlobs differently from drawText / drawPosText
robertphillips433625e2015-12-04 06:58:16 -080083 void flush(const SkTextBlob*, GrAtlasTextBlob*, GrDrawContext*,
robertphillipsccb1b572015-05-27 11:02:55 -070084 const SkPaint&, const GrPaint&, SkDrawFilter*, const GrClip&,
85 const SkMatrix& viewMatrix, const SkIRect& clipBounds, SkScalar x, SkScalar y,
86 SkScalar transX, SkScalar transY);
robertphillips433625e2015-12-04 06:58:16 -080087 void flush(GrAtlasTextBlob*, GrDrawContext*, const SkPaint&,
joshualitt1107e902015-05-11 14:52:11 -070088 const GrPaint&, const GrClip&, const SkIRect& clipBounds);
joshualitt1d89e8d2015-04-01 12:40:54 -070089
joshualitt9bd2daf2015-04-17 09:30:06 -070090 // A helper for drawing BitmapText in a run of distance fields
joshualitt374b2f72015-07-21 08:05:03 -070091 inline void fallbackDrawPosText(GrAtlasTextBlob*, int runIndex,
robertphillips6ee690e2015-12-02 08:57:50 -080092 const GrClip&, GrColor color,
joshualitt9bd2daf2015-04-17 09:30:06 -070093 const SkPaint&, const SkMatrix& viewMatrix,
94 const SkTDArray<char>& fallbackTxt,
95 const SkTDArray<SkScalar>& fallbackPos,
96 int scalarsPerPosition,
robertphillips6ee690e2015-12-02 08:57:50 -080097 const SkPoint& offset);
joshualitt9bd2daf2015-04-17 09:30:06 -070098
joshualitt374b2f72015-07-21 08:05:03 -070099 void internalDrawBMPText(GrAtlasTextBlob*, int runIndex, SkGlyphCache*, const SkPaint&,
joshualitt9e36c1a2015-04-14 12:17:27 -0700100 GrColor color, const SkMatrix& viewMatrix,
joshualitt1d89e8d2015-04-01 12:40:54 -0700101 const char text[], size_t byteLength,
robertphillips6ee690e2015-12-02 08:57:50 -0800102 SkScalar x, SkScalar y);
joshualitt374b2f72015-07-21 08:05:03 -0700103 void internalDrawBMPPosText(GrAtlasTextBlob*, int runIndex, SkGlyphCache*, const SkPaint&,
joshualitt9bd2daf2015-04-17 09:30:06 -0700104 GrColor color, const SkMatrix& viewMatrix,
105 const char text[], size_t byteLength,
106 const SkScalar pos[], int scalarsPerPosition,
robertphillips6ee690e2015-12-02 08:57:50 -0800107 const SkPoint& offset);
joshualitt9bd2daf2015-04-17 09:30:06 -0700108
jvanverth157e6482015-09-09 08:05:12 -0700109 void internalDrawDFText(GrAtlasTextBlob*, int runIndex, const SkPaint&,
joshualitt9bd2daf2015-04-17 09:30:06 -0700110 GrColor color, const SkMatrix& viewMatrix,
111 const char text[], size_t byteLength,
robertphillips6ee690e2015-12-02 08:57:50 -0800112 SkScalar x, SkScalar y,
joshualitt9bd2daf2015-04-17 09:30:06 -0700113 SkScalar textRatio,
114 SkTDArray<char>* fallbackTxt,
115 SkTDArray<SkScalar>* fallbackPos,
116 SkPoint* offset, const SkPaint& origPaint);
jvanverth157e6482015-09-09 08:05:12 -0700117 void internalDrawDFPosText(GrAtlasTextBlob*, int runIndex, const SkPaint&,
joshualitt9bd2daf2015-04-17 09:30:06 -0700118 GrColor color, const SkMatrix& viewMatrix,
119 const char text[], size_t byteLength,
120 const SkScalar pos[], int scalarsPerPosition,
robertphillips6ee690e2015-12-02 08:57:50 -0800121 const SkPoint& offset,
joshualitt9bd2daf2015-04-17 09:30:06 -0700122 SkScalar textRatio,
123 SkTDArray<char>* fallbackTxt,
124 SkTDArray<SkScalar>* fallbackPos);
joshualitt1d89e8d2015-04-01 12:40:54 -0700125
126 // sets up the descriptor on the blob and returns a detached cache. Client must attach
joshualitt9e36c1a2015-04-14 12:17:27 -0700127 inline static GrColor ComputeCanonicalColor(const SkPaint&, bool lcd);
joshualitt9bd2daf2015-04-17 09:30:06 -0700128 inline SkGlyphCache* setupCache(Run*, const SkPaint&, const SkMatrix* viewMatrix, bool noGamma);
joshualitt374b2f72015-07-21 08:05:03 -0700129 void regenerateTextBlob(GrAtlasTextBlob* bmp, const SkPaint& skPaint, GrColor,
joshualitt9e36c1a2015-04-14 12:17:27 -0700130 const SkMatrix& viewMatrix,
joshualitt1d89e8d2015-04-01 12:40:54 -0700131 const SkTextBlob* blob, SkScalar x, SkScalar y,
robertphillips6ee690e2015-12-02 08:57:50 -0800132 SkDrawFilter* drawFilter,
jvanverth0628a522015-08-18 07:44:22 -0700133 const GrClip&);
joshualitt9e36c1a2015-04-14 12:17:27 -0700134 inline static bool HasLCD(const SkTextBlob*);
joshualitt374b2f72015-07-21 08:05:03 -0700135 inline void initDistanceFieldPaint(GrAtlasTextBlob*, SkPaint*, SkScalar* textRatio,
joshualitt64c99cc2015-04-21 09:43:03 -0700136 const SkMatrix&);
joshualitt9bd2daf2015-04-17 09:30:06 -0700137
joshualitt79dfb2b2015-05-11 08:58:08 -0700138 // Test methods
139 // TODO this is really ugly. It'd be much nicer if positioning could be moved to batch
robertphillips6ee690e2015-12-02 08:57:50 -0800140 inline GrAtlasTextBlob* createDrawTextBlob(const GrClip&, const GrPaint&,
141 const SkPaint&, const SkMatrix& viewMatrix,
142 const char text[], size_t byteLength,
143 SkScalar x, SkScalar y,
144 const SkIRect& regionClipBounds);
145 inline GrAtlasTextBlob* createDrawPosTextBlob(const GrClip&, const GrPaint&,
146 const SkPaint&, const SkMatrix& viewMatrix,
147 const char text[], size_t byteLength,
148 const SkScalar pos[], int scalarsPerPosition,
149 const SkPoint& offset,
150 const SkIRect& regionClipBounds);
joshualitt79dfb2b2015-05-11 08:58:08 -0700151
joshualitt1d89e8d2015-04-01 12:40:54 -0700152 GrBatchTextStrike* fCurrStrike;
joshualittb7133be2015-04-08 09:08:31 -0700153 GrTextBlobCache* fCache;
joshualitt1acabf32015-12-10 09:10:10 -0800154 SkAutoTUnref<const GrDistanceFieldAdjustTable> fDistanceAdjustTable;
joshualitt1d89e8d2015-04-01 12:40:54 -0700155
joshualitt79dfb2b2015-05-11 08:58:08 -0700156#ifdef GR_TEST_UTILS
bsalomonabd30f52015-08-13 13:34:48 -0700157 DRAW_BATCH_TEST_FRIEND(TextBlobBatch);
joshualitt79dfb2b2015-05-11 08:58:08 -0700158#endif
159
joshualitt1d89e8d2015-04-01 12:40:54 -0700160 typedef GrTextContext INHERITED;
161};
162
163#endif