blob: e4e9af9b20ae61c074814f15c2959ce488534bd8 [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 Derby86240592018-05-24 16:12:31 -040026 static const int kVerticesPerGlyph = GrTextBlob::kVerticesPerGlyph;
joshualitta751c972015-11-20 13:37:32 -080027 static const int kIndicesPerGlyph = 6;
28
joshualitta751c972015-11-20 13:37:32 -080029 struct Geometry {
Herb Derby1c5be7b2019-12-13 12:03:06 -050030 SkMatrix fDrawMatrix;
Brian Osmancf860852018-10-31 14:04:39 -040031 SkIRect fClipRect;
Herb Derbyc514e7d2019-12-11 17:00:31 -050032 GrTextBlob* fBlob;
Herb Derby5bf5b042019-12-12 16:37:03 -050033 SkPoint fDrawOrigin;
Herb Derby660c2ff2019-11-14 18:22:41 -050034 GrTextBlob::SubRun* fSubRunPtr;
Brian Osmancf860852018-10-31 14:04:39 -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
Herb Derby3c873af2020-04-29 15:56:07 -040040 static std::unique_ptr<GrAtlasTextOp> MakeBitmap(GrRecordingContext* context,
41 GrPaint&& paint,
42 GrTextBlob::SubRun* subrun,
43 const SkMatrix& drawMatrix,
44 SkPoint drawOrigin,
45 const SkIRect& clipRect,
46 const SkPMColor4f& filteredColor);
joshualitta751c972015-11-20 13:37:32 -080047
Brian Salomonf8334782017-01-03 09:42:58 -050048 static std::unique_ptr<GrAtlasTextOp> MakeDistanceField(
Robert Phillipsb97da532019-02-12 15:24:12 -050049 GrRecordingContext*,
50 GrPaint&&,
Herb Derby3c873af2020-04-29 15:56:07 -040051 GrTextBlob::SubRun*,
52 const SkMatrix& drawMatrix,
53 SkPoint drawOrigin,
54 const SkIRect& clipRect,
55 const SkPMColor4f& filteredColor,
Robert Phillips7c525e62018-06-12 10:11:12 -040056 bool useGammaCorrectDistanceTable,
57 SkColor luminanceColor,
Herb Derby3c873af2020-04-29 15:56:07 -040058 const SkSurfaceProps&);
joshualitta751c972015-11-20 13:37:32 -080059
Brian Salomon344ec422016-12-15 10:58:41 -050060 const char* name() const override { return "AtlasTextOp"; }
joshualitta751c972015-11-20 13:37:32 -080061
Chris Dalton1706cbf2019-05-21 19:35:29 -060062 void visitProxies(const VisitProxyFunc& func) const override;
Robert Phillipsb493eeb2017-09-13 13:10:52 -040063
Brian Osman9a390ac2018-11-12 09:47:48 -050064#ifdef SK_DEBUG
joshualitta751c972015-11-20 13:37:32 -080065 SkString dumpInfo() const override;
Brian Osman9a390ac2018-11-12 09:47:48 -050066#endif
joshualitta751c972015-11-20 13:37:32 -080067
Brian Salomon44acb5b2017-07-18 19:59:24 -040068 FixedFunctionFlags fixedFunctionFlags() const override;
69
Chris Dalton6ce447a2019-06-23 18:07:38 -060070 GrProcessorSet::Analysis finalize(const GrCaps&, const GrAppliedClip*,
71 bool hasMixedSampledCoverage, GrClampType) override;
Brian Salomon44acb5b2017-07-18 19:59:24 -040072
Brian Salomoncbcb0a12017-11-19 13:20:13 -050073 enum MaskType {
74 kGrayscaleCoverageMask_MaskType,
75 kLCDCoverageMask_MaskType,
76 kColorBitmapMask_MaskType,
77 kAliasedDistanceField_MaskType,
78 kGrayscaleDistanceField_MaskType,
79 kLCDDistanceField_MaskType,
80 kLCDBGRDistanceField_MaskType,
81 };
82
83 MaskType maskType() const { return fMaskType; }
84
Herb Derby4598fa12020-06-10 14:54:22 -040085#if GR_TEST_UTILS
86 static std::unique_ptr<GrDrawOp> CreateOpTestingOnly(GrRenderTargetContext* rtc,
87 const SkPaint& skPaint,
88 const SkFont& font,
89 const SkMatrixProvider& mtxProvider,
90 const char* text,
91 int x,
92 int y);
93#endif
94
joshualitta751c972015-11-20 13:37:32 -080095private:
Robert Phillips7c525e62018-06-12 10:11:12 -040096 friend class GrOpMemoryPool; // for ctor
97
Jim Van Verthc8a65e32017-10-25 14:25:27 -040098 // The minimum number of Geometry we will try to allocate.
Jim Van Verth56c37142017-10-31 14:44:25 -040099 static constexpr auto kMinGeometryAllocated = 12;
Jim Van Verthc8a65e32017-10-25 14:25:27 -0400100
Herb Derby3c873af2020-04-29 15:56:07 -0400101 GrAtlasTextOp(MaskType maskType,
102 GrPaint&& paint,
103 GrTextBlob::SubRun* subrun,
104 const SkMatrix& drawMatrix,
105 SkPoint drawOrigin,
106 const SkIRect& clipRect,
107 const SkPMColor4f& filteredColor,
108 SkColor luminanceColor,
109 bool useGammaCorrectDistanceTable,
110 uint32_t DFGPFlags);
joshualitta751c972015-11-20 13:37:32 -0800111
112 struct FlushInfo {
Brian Salomon344ec422016-12-15 10:58:41 -0500113 sk_sp<const GrBuffer> fVertexBuffer;
114 sk_sp<const GrBuffer> fIndexBuffer;
Robert Phillips7cd0bfe2019-11-20 16:08:10 -0500115 GrGeometryProcessor* fGeometryProcessor;
Chris Dalton304e14d2020-03-17 14:29:06 -0600116 const GrSurfaceProxy** fPrimProcProxies;
Brian Salomon43cbd722020-01-03 22:09:12 -0500117 int fGlyphsToFlush = 0;
118 int fVertexOffset = 0;
119 int fNumDraws = 0;
joshualitta751c972015-11-20 13:37:32 -0800120 };
121
Robert Phillips2669a7b2020-03-12 12:07:19 -0400122 GrProgramInfo* programInfo() override {
123 // TODO [PI]: implement
124 return nullptr;
125 }
126
Robert Phillips4133dc42020-03-11 15:55:55 -0400127 void onCreateProgramInfo(const GrCaps*,
128 SkArenaAlloc*,
Brian Salomon8afde5f2020-04-01 16:22:00 -0400129 const GrSurfaceProxyView* writeView,
Robert Phillips4133dc42020-03-11 15:55:55 -0400130 GrAppliedClip&&,
131 const GrXferProcessor::DstProxyView&) override {
132 // TODO [PI]: implement
133 }
134
Robert Phillips2669a7b2020-03-12 12:07:19 -0400135 void onPrePrepareDraws(GrRecordingContext*,
Brian Salomon8afde5f2020-04-01 16:22:00 -0400136 const GrSurfaceProxyView* writeView,
Robert Phillips2669a7b2020-03-12 12:07:19 -0400137 GrAppliedClip*,
138 const GrXferProcessor::DstProxyView&) override {
139 // TODO [PI]: implement
140 }
141
Brian Salomon91326c32017-08-09 16:02:19 -0400142 void onPrepareDraws(Target*) override;
Chris Dalton07cdcfc92019-02-26 11:13:22 -0700143 void onExecute(GrOpFlushState*, const SkRect& chainBounds) override;
joshualitta751c972015-11-20 13:37:32 -0800144
joshualitta751c972015-11-20 13:37:32 -0800145 GrMaskFormat maskFormat() const {
146 switch (fMaskType) {
147 case kLCDCoverageMask_MaskType:
148 return kA565_GrMaskFormat;
149 case kColorBitmapMask_MaskType:
150 return kARGB_GrMaskFormat;
151 case kGrayscaleCoverageMask_MaskType:
Jim Van Verth90e89b32017-07-06 16:36:55 -0400152 case kAliasedDistanceField_MaskType:
joshualitta751c972015-11-20 13:37:32 -0800153 case kGrayscaleDistanceField_MaskType:
154 case kLCDDistanceField_MaskType:
Jim Van Verth90e89b32017-07-06 16:36:55 -0400155 case kLCDBGRDistanceField_MaskType:
joshualitta751c972015-11-20 13:37:32 -0800156 return kA8_GrMaskFormat;
157 }
Brian Salomon344ec422016-12-15 10:58:41 -0500158 return kA8_GrMaskFormat; // suppress warning
joshualitta751c972015-11-20 13:37:32 -0800159 }
160
161 bool usesDistanceFields() const {
Jim Van Verth90e89b32017-07-06 16:36:55 -0400162 return kAliasedDistanceField_MaskType == fMaskType ||
163 kGrayscaleDistanceField_MaskType == fMaskType ||
164 kLCDDistanceField_MaskType == fMaskType ||
165 kLCDBGRDistanceField_MaskType == fMaskType;
joshualitta751c972015-11-20 13:37:32 -0800166 }
167
168 bool isLCD() const {
Jim Van Verth90e89b32017-07-06 16:36:55 -0400169 return kLCDCoverageMask_MaskType == fMaskType ||
170 kLCDDistanceField_MaskType == fMaskType ||
171 kLCDBGRDistanceField_MaskType == fMaskType;
joshualitta751c972015-11-20 13:37:32 -0800172 }
173
Herb Derby4513cdd2020-01-31 13:28:49 -0500174 inline void createDrawForGeneratedGlyphs(
175 GrMeshDrawOp::Target* target, FlushInfo* flushInfo) const;
joshualitta751c972015-11-20 13:37:32 -0800176
Brian Osmancf860852018-10-31 14:04:39 -0400177 const SkPMColor4f& color() const { SkASSERT(fGeoCount > 0); return fGeoData[0].fColor; }
Brian Salomon344ec422016-12-15 10:58:41 -0500178 bool usesLocalCoords() const { return fUsesLocalCoords; }
179 int numGlyphs() const { return fNumGlyphs; }
joshualitta751c972015-11-20 13:37:32 -0800180
Michael Ludwig28b0c5d2019-12-19 14:51:00 -0500181 CombineResult onCombineIfPossible(GrOp* t, GrRecordingContext::Arenas*,
182 const GrCaps& caps) override;
joshualitta751c972015-11-20 13:37:32 -0800183
Robert Phillips841c9a52020-03-27 12:41:31 -0400184 GrGeometryProcessor* setupDfProcessor(SkArenaAlloc*,
185 const GrShaderCaps&,
Greg Daniel9715b6c2019-12-10 15:03:10 -0500186 const GrSurfaceProxyView* views,
187 unsigned int numActiveViews) const;
joshualitta751c972015-11-20 13:37:32 -0800188
Herb Derby3c873af2020-04-29 15:56:07 -0400189 const MaskType fMaskType;
190 const bool fNeedsGlyphTransform;
191 const SkColor fLuminanceColor{0};
192 const bool fUseGammaCorrectDistanceTable{false};
193 // Distance field properties
194 const uint32_t fDFGPFlags;
Brian Salomon44acb5b2017-07-18 19:59:24 -0400195 SkAutoSTMalloc<kMinGeometryAllocated, Geometry> fGeoData;
Jim Van Verthc8a65e32017-10-25 14:25:27 -0400196 int fGeoDataAllocSize;
Brian Salomon44acb5b2017-07-18 19:59:24 -0400197 GrProcessorSet fProcessors;
Herb Derby3c873af2020-04-29 15:56:07 -0400198 bool fUsesLocalCoords;
Brian Salomon44acb5b2017-07-18 19:59:24 -0400199 int fGeoCount;
200 int fNumGlyphs;
joshualitta751c972015-11-20 13:37:32 -0800201
Brian Salomon44acb5b2017-07-18 19:59:24 -0400202 typedef GrMeshDrawOp INHERITED;
joshualitta751c972015-11-20 13:37:32 -0800203};
204
joshualitta751c972015-11-20 13:37:32 -0800205#endif