blob: 44c637781dad28cfa495f6fb99424d61c646a961 [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 Derby252a3c02020-07-14 12:15:34 -040030 GrTextBlob* fBlob;
Herb Derby252a3c02020-07-14 12:15:34 -040031 GrAtlasSubRun* fSubRunPtr;
Herb Derby268e48b2020-07-16 12:56:58 -040032 SkMatrix fDrawMatrix;
33 SkPoint fDrawOrigin;
34 SkIRect fClipRect;
Herb Derby252a3c02020-07-14 12:15:34 -040035 SkPMColor4f fColor;
Herb Derby92cc5802020-06-04 09:59:38 -040036
Herb Derby64391c42020-05-16 14:32:15 -040037 void fillVertexData(void* dst, int offset, int count) const;
joshualitta751c972015-11-20 13:37:32 -080038 };
39
Brian Salomon344ec422016-12-15 10:58:41 -050040 const char* name() const override { return "AtlasTextOp"; }
joshualitta751c972015-11-20 13:37:32 -080041
Chris Dalton1706cbf2019-05-21 19:35:29 -060042 void visitProxies(const VisitProxyFunc& func) const override;
Robert Phillipsb493eeb2017-09-13 13:10:52 -040043
Brian Osman9a390ac2018-11-12 09:47:48 -050044#ifdef SK_DEBUG
joshualitta751c972015-11-20 13:37:32 -080045 SkString dumpInfo() const override;
Brian Osman9a390ac2018-11-12 09:47:48 -050046#endif
joshualitta751c972015-11-20 13:37:32 -080047
Brian Salomon44acb5b2017-07-18 19:59:24 -040048 FixedFunctionFlags fixedFunctionFlags() const override;
49
Chris Dalton6ce447a2019-06-23 18:07:38 -060050 GrProcessorSet::Analysis finalize(const GrCaps&, const GrAppliedClip*,
51 bool hasMixedSampledCoverage, GrClampType) override;
Brian Salomon44acb5b2017-07-18 19:59:24 -040052
Brian Salomoncbcb0a12017-11-19 13:20:13 -050053 enum MaskType {
54 kGrayscaleCoverageMask_MaskType,
55 kLCDCoverageMask_MaskType,
56 kColorBitmapMask_MaskType,
57 kAliasedDistanceField_MaskType,
58 kGrayscaleDistanceField_MaskType,
59 kLCDDistanceField_MaskType,
60 kLCDBGRDistanceField_MaskType,
61 };
62
63 MaskType maskType() const { return fMaskType; }
64
Herb Derby4598fa12020-06-10 14:54:22 -040065#if GR_TEST_UTILS
66 static std::unique_ptr<GrDrawOp> CreateOpTestingOnly(GrRenderTargetContext* rtc,
67 const SkPaint& skPaint,
68 const SkFont& font,
69 const SkMatrixProvider& mtxProvider,
70 const char* text,
71 int x,
72 int y);
73#endif
74
joshualitta751c972015-11-20 13:37:32 -080075private:
Robert Phillips7c525e62018-06-12 10:11:12 -040076 friend class GrOpMemoryPool; // for ctor
77
Jim Van Verthc8a65e32017-10-25 14:25:27 -040078 // The minimum number of Geometry we will try to allocate.
Jim Van Verth56c37142017-10-31 14:44:25 -040079 static constexpr auto kMinGeometryAllocated = 12;
Jim Van Verthc8a65e32017-10-25 14:25:27 -040080
Herb Derby3c873af2020-04-29 15:56:07 -040081 GrAtlasTextOp(MaskType maskType,
Herb Derby268e48b2020-07-16 12:56:58 -040082 bool needsTransform,
83 int glyphCount,
84 SkRect deviceRect,
Herb Derby3c873af2020-04-29 15:56:07 -040085 GrPaint&& paint,
Herb Derby268e48b2020-07-16 12:56:58 -040086 Geometry&& geo);
87
88 GrAtlasTextOp(MaskType maskType,
89 bool needsTransform,
90 int glyphCount,
91 SkRect deviceRect,
Herb Derby3c873af2020-04-29 15:56:07 -040092 SkColor luminanceColor,
93 bool useGammaCorrectDistanceTable,
Herb Derby268e48b2020-07-16 12:56:58 -040094 uint32_t DFGPFlags,
95 GrPaint&& paint,
96 Geometry&& geo);
joshualitta751c972015-11-20 13:37:32 -080097
98 struct FlushInfo {
Brian Salomon344ec422016-12-15 10:58:41 -050099 sk_sp<const GrBuffer> fVertexBuffer;
100 sk_sp<const GrBuffer> fIndexBuffer;
Robert Phillips7cd0bfe2019-11-20 16:08:10 -0500101 GrGeometryProcessor* fGeometryProcessor;
Chris Dalton304e14d2020-03-17 14:29:06 -0600102 const GrSurfaceProxy** fPrimProcProxies;
Brian Salomon43cbd722020-01-03 22:09:12 -0500103 int fGlyphsToFlush = 0;
104 int fVertexOffset = 0;
105 int fNumDraws = 0;
joshualitta751c972015-11-20 13:37:32 -0800106 };
107
Robert Phillips2669a7b2020-03-12 12:07:19 -0400108 GrProgramInfo* programInfo() override {
109 // TODO [PI]: implement
110 return nullptr;
111 }
112
Robert Phillips4133dc42020-03-11 15:55:55 -0400113 void onCreateProgramInfo(const GrCaps*,
114 SkArenaAlloc*,
Brian Salomon8afde5f2020-04-01 16:22:00 -0400115 const GrSurfaceProxyView* writeView,
Robert Phillips4133dc42020-03-11 15:55:55 -0400116 GrAppliedClip&&,
117 const GrXferProcessor::DstProxyView&) override {
118 // TODO [PI]: implement
119 }
120
Robert Phillips2669a7b2020-03-12 12:07:19 -0400121 void onPrePrepareDraws(GrRecordingContext*,
Brian Salomon8afde5f2020-04-01 16:22:00 -0400122 const GrSurfaceProxyView* writeView,
Robert Phillips2669a7b2020-03-12 12:07:19 -0400123 GrAppliedClip*,
124 const GrXferProcessor::DstProxyView&) override {
125 // TODO [PI]: implement
126 }
127
Brian Salomon91326c32017-08-09 16:02:19 -0400128 void onPrepareDraws(Target*) override;
Chris Dalton07cdcfc92019-02-26 11:13:22 -0700129 void onExecute(GrOpFlushState*, const SkRect& chainBounds) override;
joshualitta751c972015-11-20 13:37:32 -0800130
joshualitta751c972015-11-20 13:37:32 -0800131 GrMaskFormat maskFormat() const {
132 switch (fMaskType) {
133 case kLCDCoverageMask_MaskType:
134 return kA565_GrMaskFormat;
135 case kColorBitmapMask_MaskType:
136 return kARGB_GrMaskFormat;
137 case kGrayscaleCoverageMask_MaskType:
Jim Van Verth90e89b32017-07-06 16:36:55 -0400138 case kAliasedDistanceField_MaskType:
joshualitta751c972015-11-20 13:37:32 -0800139 case kGrayscaleDistanceField_MaskType:
140 case kLCDDistanceField_MaskType:
Jim Van Verth90e89b32017-07-06 16:36:55 -0400141 case kLCDBGRDistanceField_MaskType:
joshualitta751c972015-11-20 13:37:32 -0800142 return kA8_GrMaskFormat;
143 }
Brian Salomon344ec422016-12-15 10:58:41 -0500144 return kA8_GrMaskFormat; // suppress warning
joshualitta751c972015-11-20 13:37:32 -0800145 }
146
147 bool usesDistanceFields() const {
Jim Van Verth90e89b32017-07-06 16:36:55 -0400148 return kAliasedDistanceField_MaskType == fMaskType ||
149 kGrayscaleDistanceField_MaskType == fMaskType ||
150 kLCDDistanceField_MaskType == fMaskType ||
151 kLCDBGRDistanceField_MaskType == fMaskType;
joshualitta751c972015-11-20 13:37:32 -0800152 }
153
154 bool isLCD() const {
Jim Van Verth90e89b32017-07-06 16:36:55 -0400155 return kLCDCoverageMask_MaskType == fMaskType ||
156 kLCDDistanceField_MaskType == fMaskType ||
157 kLCDBGRDistanceField_MaskType == fMaskType;
joshualitta751c972015-11-20 13:37:32 -0800158 }
159
Herb Derby4513cdd2020-01-31 13:28:49 -0500160 inline void createDrawForGeneratedGlyphs(
161 GrMeshDrawOp::Target* target, FlushInfo* flushInfo) const;
joshualitta751c972015-11-20 13:37:32 -0800162
Brian Osmancf860852018-10-31 14:04:39 -0400163 const SkPMColor4f& color() const { SkASSERT(fGeoCount > 0); return fGeoData[0].fColor; }
Brian Salomon344ec422016-12-15 10:58:41 -0500164 bool usesLocalCoords() const { return fUsesLocalCoords; }
165 int numGlyphs() const { return fNumGlyphs; }
joshualitta751c972015-11-20 13:37:32 -0800166
Michael Ludwig28b0c5d2019-12-19 14:51:00 -0500167 CombineResult onCombineIfPossible(GrOp* t, GrRecordingContext::Arenas*,
168 const GrCaps& caps) override;
joshualitta751c972015-11-20 13:37:32 -0800169
Robert Phillips841c9a52020-03-27 12:41:31 -0400170 GrGeometryProcessor* setupDfProcessor(SkArenaAlloc*,
171 const GrShaderCaps&,
Greg Daniel9715b6c2019-12-10 15:03:10 -0500172 const GrSurfaceProxyView* views,
173 unsigned int numActiveViews) const;
joshualitta751c972015-11-20 13:37:32 -0800174
Herb Derby3c873af2020-04-29 15:56:07 -0400175 const MaskType fMaskType;
176 const bool fNeedsGlyphTransform;
177 const SkColor fLuminanceColor{0};
178 const bool fUseGammaCorrectDistanceTable{false};
179 // Distance field properties
180 const uint32_t fDFGPFlags;
Brian Salomon44acb5b2017-07-18 19:59:24 -0400181 SkAutoSTMalloc<kMinGeometryAllocated, Geometry> fGeoData;
Jim Van Verthc8a65e32017-10-25 14:25:27 -0400182 int fGeoDataAllocSize;
Brian Salomon44acb5b2017-07-18 19:59:24 -0400183 GrProcessorSet fProcessors;
Herb Derby3c873af2020-04-29 15:56:07 -0400184 bool fUsesLocalCoords;
Brian Salomon44acb5b2017-07-18 19:59:24 -0400185 int fGeoCount;
186 int fNumGlyphs;
joshualitta751c972015-11-20 13:37:32 -0800187
Brian Salomon44acb5b2017-07-18 19:59:24 -0400188 typedef GrMeshDrawOp INHERITED;
joshualitta751c972015-11-20 13:37:32 -0800189};
190
joshualitta751c972015-11-20 13:37:32 -0800191#endif