blob: 2c53998c430ccda23918aebfe2cf946d230d7408 [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 SkMatrix fDrawMatrix;
31 SkIRect fClipRect;
32 GrTextBlob* fBlob;
33 SkPoint fDrawOrigin;
34 GrAtlasSubRun* fSubRunPtr;
35 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,
82 GrPaint&& paint,
Herb Derby252a3c02020-07-14 12:15:34 -040083 GrAtlasSubRun* subrun,
Herb Derby3c873af2020-04-29 15:56:07 -040084 const SkMatrix& drawMatrix,
85 SkPoint drawOrigin,
86 const SkIRect& clipRect,
87 const SkPMColor4f& filteredColor,
88 SkColor luminanceColor,
89 bool useGammaCorrectDistanceTable,
90 uint32_t DFGPFlags);
joshualitta751c972015-11-20 13:37:32 -080091
92 struct FlushInfo {
Brian Salomon344ec422016-12-15 10:58:41 -050093 sk_sp<const GrBuffer> fVertexBuffer;
94 sk_sp<const GrBuffer> fIndexBuffer;
Robert Phillips7cd0bfe2019-11-20 16:08:10 -050095 GrGeometryProcessor* fGeometryProcessor;
Chris Dalton304e14d2020-03-17 14:29:06 -060096 const GrSurfaceProxy** fPrimProcProxies;
Brian Salomon43cbd722020-01-03 22:09:12 -050097 int fGlyphsToFlush = 0;
98 int fVertexOffset = 0;
99 int fNumDraws = 0;
joshualitta751c972015-11-20 13:37:32 -0800100 };
101
Robert Phillips2669a7b2020-03-12 12:07:19 -0400102 GrProgramInfo* programInfo() override {
103 // TODO [PI]: implement
104 return nullptr;
105 }
106
Robert Phillips4133dc42020-03-11 15:55:55 -0400107 void onCreateProgramInfo(const GrCaps*,
108 SkArenaAlloc*,
Brian Salomon8afde5f2020-04-01 16:22:00 -0400109 const GrSurfaceProxyView* writeView,
Robert Phillips4133dc42020-03-11 15:55:55 -0400110 GrAppliedClip&&,
111 const GrXferProcessor::DstProxyView&) override {
112 // TODO [PI]: implement
113 }
114
Robert Phillips2669a7b2020-03-12 12:07:19 -0400115 void onPrePrepareDraws(GrRecordingContext*,
Brian Salomon8afde5f2020-04-01 16:22:00 -0400116 const GrSurfaceProxyView* writeView,
Robert Phillips2669a7b2020-03-12 12:07:19 -0400117 GrAppliedClip*,
118 const GrXferProcessor::DstProxyView&) override {
119 // TODO [PI]: implement
120 }
121
Brian Salomon91326c32017-08-09 16:02:19 -0400122 void onPrepareDraws(Target*) override;
Chris Dalton07cdcfc92019-02-26 11:13:22 -0700123 void onExecute(GrOpFlushState*, const SkRect& chainBounds) override;
joshualitta751c972015-11-20 13:37:32 -0800124
joshualitta751c972015-11-20 13:37:32 -0800125 GrMaskFormat maskFormat() const {
126 switch (fMaskType) {
127 case kLCDCoverageMask_MaskType:
128 return kA565_GrMaskFormat;
129 case kColorBitmapMask_MaskType:
130 return kARGB_GrMaskFormat;
131 case kGrayscaleCoverageMask_MaskType:
Jim Van Verth90e89b32017-07-06 16:36:55 -0400132 case kAliasedDistanceField_MaskType:
joshualitta751c972015-11-20 13:37:32 -0800133 case kGrayscaleDistanceField_MaskType:
134 case kLCDDistanceField_MaskType:
Jim Van Verth90e89b32017-07-06 16:36:55 -0400135 case kLCDBGRDistanceField_MaskType:
joshualitta751c972015-11-20 13:37:32 -0800136 return kA8_GrMaskFormat;
137 }
Brian Salomon344ec422016-12-15 10:58:41 -0500138 return kA8_GrMaskFormat; // suppress warning
joshualitta751c972015-11-20 13:37:32 -0800139 }
140
141 bool usesDistanceFields() const {
Jim Van Verth90e89b32017-07-06 16:36:55 -0400142 return kAliasedDistanceField_MaskType == fMaskType ||
143 kGrayscaleDistanceField_MaskType == fMaskType ||
144 kLCDDistanceField_MaskType == fMaskType ||
145 kLCDBGRDistanceField_MaskType == fMaskType;
joshualitta751c972015-11-20 13:37:32 -0800146 }
147
148 bool isLCD() const {
Jim Van Verth90e89b32017-07-06 16:36:55 -0400149 return kLCDCoverageMask_MaskType == fMaskType ||
150 kLCDDistanceField_MaskType == fMaskType ||
151 kLCDBGRDistanceField_MaskType == fMaskType;
joshualitta751c972015-11-20 13:37:32 -0800152 }
153
Herb Derby4513cdd2020-01-31 13:28:49 -0500154 inline void createDrawForGeneratedGlyphs(
155 GrMeshDrawOp::Target* target, FlushInfo* flushInfo) const;
joshualitta751c972015-11-20 13:37:32 -0800156
Brian Osmancf860852018-10-31 14:04:39 -0400157 const SkPMColor4f& color() const { SkASSERT(fGeoCount > 0); return fGeoData[0].fColor; }
Brian Salomon344ec422016-12-15 10:58:41 -0500158 bool usesLocalCoords() const { return fUsesLocalCoords; }
159 int numGlyphs() const { return fNumGlyphs; }
joshualitta751c972015-11-20 13:37:32 -0800160
Michael Ludwig28b0c5d2019-12-19 14:51:00 -0500161 CombineResult onCombineIfPossible(GrOp* t, GrRecordingContext::Arenas*,
162 const GrCaps& caps) override;
joshualitta751c972015-11-20 13:37:32 -0800163
Robert Phillips841c9a52020-03-27 12:41:31 -0400164 GrGeometryProcessor* setupDfProcessor(SkArenaAlloc*,
165 const GrShaderCaps&,
Greg Daniel9715b6c2019-12-10 15:03:10 -0500166 const GrSurfaceProxyView* views,
167 unsigned int numActiveViews) const;
joshualitta751c972015-11-20 13:37:32 -0800168
Herb Derby3c873af2020-04-29 15:56:07 -0400169 const MaskType fMaskType;
170 const bool fNeedsGlyphTransform;
171 const SkColor fLuminanceColor{0};
172 const bool fUseGammaCorrectDistanceTable{false};
173 // Distance field properties
174 const uint32_t fDFGPFlags;
Brian Salomon44acb5b2017-07-18 19:59:24 -0400175 SkAutoSTMalloc<kMinGeometryAllocated, Geometry> fGeoData;
Jim Van Verthc8a65e32017-10-25 14:25:27 -0400176 int fGeoDataAllocSize;
Brian Salomon44acb5b2017-07-18 19:59:24 -0400177 GrProcessorSet fProcessors;
Herb Derby3c873af2020-04-29 15:56:07 -0400178 bool fUsesLocalCoords;
Brian Salomon44acb5b2017-07-18 19:59:24 -0400179 int fGeoCount;
180 int fNumGlyphs;
joshualitta751c972015-11-20 13:37:32 -0800181
Brian Salomon44acb5b2017-07-18 19:59:24 -0400182 typedef GrMeshDrawOp INHERITED;
joshualitta751c972015-11-20 13:37:32 -0800183};
184
joshualitta751c972015-11-20 13:37:32 -0800185#endif