blob: ad10253431949a609ce827beee67edc820c4efc4 [file] [log] [blame]
joshualitta751c972015-11-20 13:37:32 -08001/*
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
Brian Salomon344ec422016-12-15 10:58:41 -05008#ifndef GrAtlasTextOp_DEFINED
9#define GrAtlasTextOp_DEFINED
joshualitta751c972015-11-20 13:37:32 -080010
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "src/gpu/ops/GrMeshDrawOp.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050012#include "src/gpu/text/GrTextBlob.h"
joshualitta751c972015-11-20 13:37:32 -080013
Robert Phillipsb97da532019-02-12 15:24:12 -050014class GrRecordingContext;
Brian Salomoncbcb0a12017-11-19 13:20:13 -050015
Brian Salomon44acb5b2017-07-18 19:59:24 -040016class GrAtlasTextOp final : public GrMeshDrawOp {
joshualitta751c972015-11-20 13:37:32 -080017public:
Brian Salomon25a88092016-12-01 09:36:50 -050018 DEFINE_OP_CLASS_ID
joshualitta751c972015-11-20 13:37:32 -080019
Brian Salomonf8334782017-01-03 09:42:58 -050020 ~GrAtlasTextOp() override {
21 for (int i = 0; i < fGeoCount; i++) {
22 fGeoData[i].fBlob->unref();
23 }
24 }
25
Herb Derby252a3c02020-07-14 12:15:34 -040026 static const int kVerticesPerGlyph = GrAtlasSubRun::kVerticesPerGlyph;
joshualitta751c972015-11-20 13:37:32 -080027 static const int kIndicesPerGlyph = 6;
28
joshualitta751c972015-11-20 13:37:32 -080029 struct Geometry {
Herb Derby64391c42020-05-16 14:32:15 -040030 void fillVertexData(void* dst, int offset, int count) const;
Herb Derby1d17e492020-07-21 11:45:04 -040031
Herb Derby43ad7912020-07-20 16:14:19 -040032 const GrAtlasSubRun& fSubRun;
Herb Derby1d17e492020-07-21 11:45:04 -040033 const SkMatrix fDrawMatrix;
34 const SkPoint fDrawOrigin;
35 const SkIRect fClipRect;
36 GrTextBlob* const fBlob; // mutable to make unref call in Op dtor.
37
38 // Strangely, the color is mutated as part of the onPrepare process.
39 SkPMColor4f fColor;
joshualitta751c972015-11-20 13:37:32 -080040 };
41
Brian Salomon344ec422016-12-15 10:58:41 -050042 const char* name() const override { return "AtlasTextOp"; }
joshualitta751c972015-11-20 13:37:32 -080043
Chris Dalton1706cbf2019-05-21 19:35:29 -060044 void visitProxies(const VisitProxyFunc& func) const override;
Robert Phillipsb493eeb2017-09-13 13:10:52 -040045
Brian Salomon44acb5b2017-07-18 19:59:24 -040046 FixedFunctionFlags fixedFunctionFlags() const override;
47
Chris Dalton6ce447a2019-06-23 18:07:38 -060048 GrProcessorSet::Analysis finalize(const GrCaps&, const GrAppliedClip*,
49 bool hasMixedSampledCoverage, GrClampType) override;
Brian Salomon44acb5b2017-07-18 19:59:24 -040050
Brian Salomoncbcb0a12017-11-19 13:20:13 -050051 enum MaskType {
52 kGrayscaleCoverageMask_MaskType,
53 kLCDCoverageMask_MaskType,
54 kColorBitmapMask_MaskType,
55 kAliasedDistanceField_MaskType,
56 kGrayscaleDistanceField_MaskType,
57 kLCDDistanceField_MaskType,
58 kLCDBGRDistanceField_MaskType,
59 };
60
61 MaskType maskType() const { return fMaskType; }
62
Herb Derby4598fa12020-06-10 14:54:22 -040063#if GR_TEST_UTILS
Herb Derbyc76d4092020-10-07 16:46:15 -040064 static GrOp::Owner CreateOpTestingOnly(GrRenderTargetContext* rtc,
65 const SkPaint& skPaint,
66 const SkFont& font,
67 const SkMatrixProvider& mtxProvider,
68 const char* text,
69 int x,
70 int y);
Herb Derby4598fa12020-06-10 14:54:22 -040071#endif
72
joshualitta751c972015-11-20 13:37:32 -080073private:
Herb Derbyc76d4092020-10-07 16:46:15 -040074 friend class GrOp; // for ctor
Robert Phillips7c525e62018-06-12 10:11:12 -040075
Jim Van Verthc8a65e32017-10-25 14:25:27 -040076 // The minimum number of Geometry we will try to allocate.
Jim Van Verth56c37142017-10-31 14:44:25 -040077 static constexpr auto kMinGeometryAllocated = 12;
Jim Van Verthc8a65e32017-10-25 14:25:27 -040078
Herb Derby3c873af2020-04-29 15:56:07 -040079 GrAtlasTextOp(MaskType maskType,
Herb Derby268e48b2020-07-16 12:56:58 -040080 bool needsTransform,
81 int glyphCount,
82 SkRect deviceRect,
Herb Derby1d17e492020-07-21 11:45:04 -040083 const Geometry& geo,
84 GrPaint&& paint);
Herb Derby268e48b2020-07-16 12:56:58 -040085
86 GrAtlasTextOp(MaskType maskType,
87 bool needsTransform,
88 int glyphCount,
89 SkRect deviceRect,
Herb Derby3c873af2020-04-29 15:56:07 -040090 SkColor luminanceColor,
91 bool useGammaCorrectDistanceTable,
Herb Derby268e48b2020-07-16 12:56:58 -040092 uint32_t DFGPFlags,
Herb Derby1d17e492020-07-21 11:45:04 -040093 const Geometry& geo,
94 GrPaint&& paint);
joshualitta751c972015-11-20 13:37:32 -080095
96 struct FlushInfo {
Brian Salomon344ec422016-12-15 10:58:41 -050097 sk_sp<const GrBuffer> fVertexBuffer;
98 sk_sp<const GrBuffer> fIndexBuffer;
Robert Phillips7cd0bfe2019-11-20 16:08:10 -050099 GrGeometryProcessor* fGeometryProcessor;
Chris Dalton304e14d2020-03-17 14:29:06 -0600100 const GrSurfaceProxy** fPrimProcProxies;
Brian Salomon43cbd722020-01-03 22:09:12 -0500101 int fGlyphsToFlush = 0;
102 int fVertexOffset = 0;
103 int fNumDraws = 0;
joshualitta751c972015-11-20 13:37:32 -0800104 };
105
Robert Phillips2669a7b2020-03-12 12:07:19 -0400106 GrProgramInfo* programInfo() override {
107 // TODO [PI]: implement
108 return nullptr;
109 }
110
Robert Phillips4133dc42020-03-11 15:55:55 -0400111 void onCreateProgramInfo(const GrCaps*,
112 SkArenaAlloc*,
Brian Salomon8afde5f2020-04-01 16:22:00 -0400113 const GrSurfaceProxyView* writeView,
Robert Phillips4133dc42020-03-11 15:55:55 -0400114 GrAppliedClip&&,
Greg Danield358cbe2020-09-11 09:33:54 -0400115 const GrXferProcessor::DstProxyView&,
116 GrXferBarrierFlags renderPassXferBarriers) override {
Robert Phillips326f1d72020-10-01 09:43:29 -0400117 // We cannot surface the GrAtlasTextOp's programInfo at record time. As currently
118 // implemented, the GP is modified at flush time based on the number of pages in the
119 // atlas.
Robert Phillips4133dc42020-03-11 15:55:55 -0400120 }
121
Robert Phillips2669a7b2020-03-12 12:07:19 -0400122 void onPrePrepareDraws(GrRecordingContext*,
Brian Salomon8afde5f2020-04-01 16:22:00 -0400123 const GrSurfaceProxyView* writeView,
Robert Phillips2669a7b2020-03-12 12:07:19 -0400124 GrAppliedClip*,
Greg Danield358cbe2020-09-11 09:33:54 -0400125 const GrXferProcessor::DstProxyView&,
126 GrXferBarrierFlags renderPassXferBarriers) override {
Robert Phillips2669a7b2020-03-12 12:07:19 -0400127 // TODO [PI]: implement
128 }
129
Brian Salomon91326c32017-08-09 16:02:19 -0400130 void onPrepareDraws(Target*) override;
Chris Dalton07cdcfc92019-02-26 11:13:22 -0700131 void onExecute(GrOpFlushState*, const SkRect& chainBounds) override;
joshualitta751c972015-11-20 13:37:32 -0800132
John Stilesaf366522020-08-13 09:57:34 -0400133#if GR_TEST_UTILS
134 SkString onDumpInfo() const override;
135#endif
136
joshualitta751c972015-11-20 13:37:32 -0800137 GrMaskFormat maskFormat() const {
138 switch (fMaskType) {
139 case kLCDCoverageMask_MaskType:
140 return kA565_GrMaskFormat;
141 case kColorBitmapMask_MaskType:
142 return kARGB_GrMaskFormat;
143 case kGrayscaleCoverageMask_MaskType:
Jim Van Verth90e89b32017-07-06 16:36:55 -0400144 case kAliasedDistanceField_MaskType:
joshualitta751c972015-11-20 13:37:32 -0800145 case kGrayscaleDistanceField_MaskType:
146 case kLCDDistanceField_MaskType:
Jim Van Verth90e89b32017-07-06 16:36:55 -0400147 case kLCDBGRDistanceField_MaskType:
joshualitta751c972015-11-20 13:37:32 -0800148 return kA8_GrMaskFormat;
149 }
Brian Salomon344ec422016-12-15 10:58:41 -0500150 return kA8_GrMaskFormat; // suppress warning
joshualitta751c972015-11-20 13:37:32 -0800151 }
152
153 bool usesDistanceFields() const {
Jim Van Verth90e89b32017-07-06 16:36:55 -0400154 return kAliasedDistanceField_MaskType == fMaskType ||
155 kGrayscaleDistanceField_MaskType == fMaskType ||
156 kLCDDistanceField_MaskType == fMaskType ||
157 kLCDBGRDistanceField_MaskType == fMaskType;
joshualitta751c972015-11-20 13:37:32 -0800158 }
159
160 bool isLCD() const {
Jim Van Verth90e89b32017-07-06 16:36:55 -0400161 return kLCDCoverageMask_MaskType == fMaskType ||
162 kLCDDistanceField_MaskType == fMaskType ||
163 kLCDBGRDistanceField_MaskType == fMaskType;
joshualitta751c972015-11-20 13:37:32 -0800164 }
165
Herb Derby4513cdd2020-01-31 13:28:49 -0500166 inline void createDrawForGeneratedGlyphs(
167 GrMeshDrawOp::Target* target, FlushInfo* flushInfo) const;
joshualitta751c972015-11-20 13:37:32 -0800168
Brian Osmancf860852018-10-31 14:04:39 -0400169 const SkPMColor4f& color() const { SkASSERT(fGeoCount > 0); return fGeoData[0].fColor; }
Brian Salomon344ec422016-12-15 10:58:41 -0500170 bool usesLocalCoords() const { return fUsesLocalCoords; }
171 int numGlyphs() const { return fNumGlyphs; }
joshualitta751c972015-11-20 13:37:32 -0800172
Herb Derbye25c3002020-10-27 15:57:27 -0400173 CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps& caps) override;
joshualitta751c972015-11-20 13:37:32 -0800174
Robert Phillips841c9a52020-03-27 12:41:31 -0400175 GrGeometryProcessor* setupDfProcessor(SkArenaAlloc*,
176 const GrShaderCaps&,
Greg Daniel9715b6c2019-12-10 15:03:10 -0500177 const GrSurfaceProxyView* views,
178 unsigned int numActiveViews) const;
joshualitta751c972015-11-20 13:37:32 -0800179
Herb Derby3c873af2020-04-29 15:56:07 -0400180 const MaskType fMaskType;
181 const bool fNeedsGlyphTransform;
182 const SkColor fLuminanceColor{0};
183 const bool fUseGammaCorrectDistanceTable{false};
184 // Distance field properties
185 const uint32_t fDFGPFlags;
Brian Salomon44acb5b2017-07-18 19:59:24 -0400186 SkAutoSTMalloc<kMinGeometryAllocated, Geometry> fGeoData;
Jim Van Verthc8a65e32017-10-25 14:25:27 -0400187 int fGeoDataAllocSize;
Brian Salomon44acb5b2017-07-18 19:59:24 -0400188 GrProcessorSet fProcessors;
Herb Derby3c873af2020-04-29 15:56:07 -0400189 bool fUsesLocalCoords;
Brian Salomon44acb5b2017-07-18 19:59:24 -0400190 int fGeoCount;
191 int fNumGlyphs;
joshualitta751c972015-11-20 13:37:32 -0800192
John Stiles7571f9e2020-09-02 22:42:33 -0400193 using INHERITED = GrMeshDrawOp;
joshualitta751c972015-11-20 13:37:32 -0800194};
195
joshualitta751c972015-11-20 13:37:32 -0800196#endif