blob: 95ac80ea486844f8c93a485a9832053291c5b98d [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
32 GrAtlasSubRun* const fSubRunPtr;
33 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 Osman9a390ac2018-11-12 09:47:48 -050046#ifdef SK_DEBUG
joshualitta751c972015-11-20 13:37:32 -080047 SkString dumpInfo() const override;
Brian Osman9a390ac2018-11-12 09:47:48 -050048#endif
joshualitta751c972015-11-20 13:37:32 -080049
Brian Salomon44acb5b2017-07-18 19:59:24 -040050 FixedFunctionFlags fixedFunctionFlags() const override;
51
Chris Dalton6ce447a2019-06-23 18:07:38 -060052 GrProcessorSet::Analysis finalize(const GrCaps&, const GrAppliedClip*,
53 bool hasMixedSampledCoverage, GrClampType) override;
Brian Salomon44acb5b2017-07-18 19:59:24 -040054
Brian Salomoncbcb0a12017-11-19 13:20:13 -050055 enum MaskType {
56 kGrayscaleCoverageMask_MaskType,
57 kLCDCoverageMask_MaskType,
58 kColorBitmapMask_MaskType,
59 kAliasedDistanceField_MaskType,
60 kGrayscaleDistanceField_MaskType,
61 kLCDDistanceField_MaskType,
62 kLCDBGRDistanceField_MaskType,
63 };
64
65 MaskType maskType() const { return fMaskType; }
66
Herb Derby4598fa12020-06-10 14:54:22 -040067#if GR_TEST_UTILS
68 static std::unique_ptr<GrDrawOp> CreateOpTestingOnly(GrRenderTargetContext* rtc,
69 const SkPaint& skPaint,
70 const SkFont& font,
71 const SkMatrixProvider& mtxProvider,
72 const char* text,
73 int x,
74 int y);
75#endif
76
joshualitta751c972015-11-20 13:37:32 -080077private:
Robert Phillips7c525e62018-06-12 10:11:12 -040078 friend class GrOpMemoryPool; // for ctor
79
Jim Van Verthc8a65e32017-10-25 14:25:27 -040080 // The minimum number of Geometry we will try to allocate.
Jim Van Verth56c37142017-10-31 14:44:25 -040081 static constexpr auto kMinGeometryAllocated = 12;
Jim Van Verthc8a65e32017-10-25 14:25:27 -040082
Herb Derby3c873af2020-04-29 15:56:07 -040083 GrAtlasTextOp(MaskType maskType,
Herb Derby268e48b2020-07-16 12:56:58 -040084 bool needsTransform,
85 int glyphCount,
86 SkRect deviceRect,
Herb Derby1d17e492020-07-21 11:45:04 -040087 const Geometry& geo,
88 GrPaint&& paint);
Herb Derby268e48b2020-07-16 12:56:58 -040089
90 GrAtlasTextOp(MaskType maskType,
91 bool needsTransform,
92 int glyphCount,
93 SkRect deviceRect,
Herb Derby3c873af2020-04-29 15:56:07 -040094 SkColor luminanceColor,
95 bool useGammaCorrectDistanceTable,
Herb Derby268e48b2020-07-16 12:56:58 -040096 uint32_t DFGPFlags,
Herb Derby1d17e492020-07-21 11:45:04 -040097 const Geometry& geo,
98 GrPaint&& paint);
joshualitta751c972015-11-20 13:37:32 -080099
100 struct FlushInfo {
Brian Salomon344ec422016-12-15 10:58:41 -0500101 sk_sp<const GrBuffer> fVertexBuffer;
102 sk_sp<const GrBuffer> fIndexBuffer;
Robert Phillips7cd0bfe2019-11-20 16:08:10 -0500103 GrGeometryProcessor* fGeometryProcessor;
Chris Dalton304e14d2020-03-17 14:29:06 -0600104 const GrSurfaceProxy** fPrimProcProxies;
Brian Salomon43cbd722020-01-03 22:09:12 -0500105 int fGlyphsToFlush = 0;
106 int fVertexOffset = 0;
107 int fNumDraws = 0;
joshualitta751c972015-11-20 13:37:32 -0800108 };
109
Robert Phillips2669a7b2020-03-12 12:07:19 -0400110 GrProgramInfo* programInfo() override {
111 // TODO [PI]: implement
112 return nullptr;
113 }
114
Robert Phillips4133dc42020-03-11 15:55:55 -0400115 void onCreateProgramInfo(const GrCaps*,
116 SkArenaAlloc*,
Brian Salomon8afde5f2020-04-01 16:22:00 -0400117 const GrSurfaceProxyView* writeView,
Robert Phillips4133dc42020-03-11 15:55:55 -0400118 GrAppliedClip&&,
119 const GrXferProcessor::DstProxyView&) override {
120 // TODO [PI]: implement
121 }
122
Robert Phillips2669a7b2020-03-12 12:07:19 -0400123 void onPrePrepareDraws(GrRecordingContext*,
Brian Salomon8afde5f2020-04-01 16:22:00 -0400124 const GrSurfaceProxyView* writeView,
Robert Phillips2669a7b2020-03-12 12:07:19 -0400125 GrAppliedClip*,
126 const GrXferProcessor::DstProxyView&) override {
127 // 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
joshualitta751c972015-11-20 13:37:32 -0800133 GrMaskFormat maskFormat() const {
134 switch (fMaskType) {
135 case kLCDCoverageMask_MaskType:
136 return kA565_GrMaskFormat;
137 case kColorBitmapMask_MaskType:
138 return kARGB_GrMaskFormat;
139 case kGrayscaleCoverageMask_MaskType:
Jim Van Verth90e89b32017-07-06 16:36:55 -0400140 case kAliasedDistanceField_MaskType:
joshualitta751c972015-11-20 13:37:32 -0800141 case kGrayscaleDistanceField_MaskType:
142 case kLCDDistanceField_MaskType:
Jim Van Verth90e89b32017-07-06 16:36:55 -0400143 case kLCDBGRDistanceField_MaskType:
joshualitta751c972015-11-20 13:37:32 -0800144 return kA8_GrMaskFormat;
145 }
Brian Salomon344ec422016-12-15 10:58:41 -0500146 return kA8_GrMaskFormat; // suppress warning
joshualitta751c972015-11-20 13:37:32 -0800147 }
148
149 bool usesDistanceFields() const {
Jim Van Verth90e89b32017-07-06 16:36:55 -0400150 return kAliasedDistanceField_MaskType == fMaskType ||
151 kGrayscaleDistanceField_MaskType == fMaskType ||
152 kLCDDistanceField_MaskType == fMaskType ||
153 kLCDBGRDistanceField_MaskType == fMaskType;
joshualitta751c972015-11-20 13:37:32 -0800154 }
155
156 bool isLCD() const {
Jim Van Verth90e89b32017-07-06 16:36:55 -0400157 return kLCDCoverageMask_MaskType == fMaskType ||
158 kLCDDistanceField_MaskType == fMaskType ||
159 kLCDBGRDistanceField_MaskType == fMaskType;
joshualitta751c972015-11-20 13:37:32 -0800160 }
161
Herb Derby4513cdd2020-01-31 13:28:49 -0500162 inline void createDrawForGeneratedGlyphs(
163 GrMeshDrawOp::Target* target, FlushInfo* flushInfo) const;
joshualitta751c972015-11-20 13:37:32 -0800164
Brian Osmancf860852018-10-31 14:04:39 -0400165 const SkPMColor4f& color() const { SkASSERT(fGeoCount > 0); return fGeoData[0].fColor; }
Brian Salomon344ec422016-12-15 10:58:41 -0500166 bool usesLocalCoords() const { return fUsesLocalCoords; }
167 int numGlyphs() const { return fNumGlyphs; }
joshualitta751c972015-11-20 13:37:32 -0800168
Michael Ludwig28b0c5d2019-12-19 14:51:00 -0500169 CombineResult onCombineIfPossible(GrOp* t, GrRecordingContext::Arenas*,
170 const GrCaps& caps) override;
joshualitta751c972015-11-20 13:37:32 -0800171
Robert Phillips841c9a52020-03-27 12:41:31 -0400172 GrGeometryProcessor* setupDfProcessor(SkArenaAlloc*,
173 const GrShaderCaps&,
Greg Daniel9715b6c2019-12-10 15:03:10 -0500174 const GrSurfaceProxyView* views,
175 unsigned int numActiveViews) const;
joshualitta751c972015-11-20 13:37:32 -0800176
Herb Derby3c873af2020-04-29 15:56:07 -0400177 const MaskType fMaskType;
178 const bool fNeedsGlyphTransform;
179 const SkColor fLuminanceColor{0};
180 const bool fUseGammaCorrectDistanceTable{false};
181 // Distance field properties
182 const uint32_t fDFGPFlags;
Brian Salomon44acb5b2017-07-18 19:59:24 -0400183 SkAutoSTMalloc<kMinGeometryAllocated, Geometry> fGeoData;
Jim Van Verthc8a65e32017-10-25 14:25:27 -0400184 int fGeoDataAllocSize;
Brian Salomon44acb5b2017-07-18 19:59:24 -0400185 GrProcessorSet fProcessors;
Herb Derby3c873af2020-04-29 15:56:07 -0400186 bool fUsesLocalCoords;
Brian Salomon44acb5b2017-07-18 19:59:24 -0400187 int fGeoCount;
188 int fNumGlyphs;
joshualitta751c972015-11-20 13:37:32 -0800189
Brian Salomon44acb5b2017-07-18 19:59:24 -0400190 typedef GrMeshDrawOp INHERITED;
joshualitta751c972015-11-20 13:37:32 -0800191};
192
joshualitta751c972015-11-20 13:37:32 -0800193#endif