blob: 451de49aec4fb08e98879b17b997ebce545c2691 [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 -050015class SkAtlasTextTarget;
16
Brian Salomon44acb5b2017-07-18 19:59:24 -040017class GrAtlasTextOp final : public GrMeshDrawOp {
joshualitta751c972015-11-20 13:37:32 -080018public:
Brian Salomon25a88092016-12-01 09:36:50 -050019 DEFINE_OP_CLASS_ID
joshualitta751c972015-11-20 13:37:32 -080020
Brian Salomonf8334782017-01-03 09:42:58 -050021 ~GrAtlasTextOp() override {
22 for (int i = 0; i < fGeoCount; i++) {
23 fGeoData[i].fBlob->unref();
24 }
25 }
26
Herb Derby86240592018-05-24 16:12:31 -040027 static const int kVerticesPerGlyph = GrTextBlob::kVerticesPerGlyph;
joshualitta751c972015-11-20 13:37:32 -080028 static const int kIndicesPerGlyph = 6;
29
joshualitta751c972015-11-20 13:37:32 -080030 struct Geometry {
Herb Derby1c5be7b2019-12-13 12:03:06 -050031 SkMatrix fDrawMatrix;
Brian Osmancf860852018-10-31 14:04:39 -040032 SkIRect fClipRect;
Herb Derbyc514e7d2019-12-11 17:00:31 -050033 GrTextBlob* fBlob;
Herb Derby5bf5b042019-12-12 16:37:03 -050034 SkPoint fDrawOrigin;
Herb Derby660c2ff2019-11-14 18:22:41 -050035 GrTextBlob::SubRun* fSubRunPtr;
Brian Osmancf860852018-10-31 14:04:39 -040036 SkPMColor4f fColor;
joshualitta751c972015-11-20 13:37:32 -080037 };
38
Herb Derby3c873af2020-04-29 15:56:07 -040039 static std::unique_ptr<GrAtlasTextOp> MakeBitmap(GrRecordingContext* context,
40 GrPaint&& paint,
41 GrTextBlob::SubRun* subrun,
42 const SkMatrix& drawMatrix,
43 SkPoint drawOrigin,
44 const SkIRect& clipRect,
45 const SkPMColor4f& filteredColor);
joshualitta751c972015-11-20 13:37:32 -080046
Brian Salomonf8334782017-01-03 09:42:58 -050047 static std::unique_ptr<GrAtlasTextOp> MakeDistanceField(
Robert Phillipsb97da532019-02-12 15:24:12 -050048 GrRecordingContext*,
49 GrPaint&&,
Herb Derby3c873af2020-04-29 15:56:07 -040050 GrTextBlob::SubRun*,
51 const SkMatrix& drawMatrix,
52 SkPoint drawOrigin,
53 const SkIRect& clipRect,
54 const SkPMColor4f& filteredColor,
Robert Phillips7c525e62018-06-12 10:11:12 -040055 bool useGammaCorrectDistanceTable,
56 SkColor luminanceColor,
Herb Derby3c873af2020-04-29 15:56:07 -040057 const SkSurfaceProps&);
joshualitta751c972015-11-20 13:37:32 -080058
Brian Salomon344ec422016-12-15 10:58:41 -050059 const char* name() const override { return "AtlasTextOp"; }
joshualitta751c972015-11-20 13:37:32 -080060
Chris Dalton1706cbf2019-05-21 19:35:29 -060061 void visitProxies(const VisitProxyFunc& func) const override;
Robert Phillipsb493eeb2017-09-13 13:10:52 -040062
Brian Osman9a390ac2018-11-12 09:47:48 -050063#ifdef SK_DEBUG
joshualitta751c972015-11-20 13:37:32 -080064 SkString dumpInfo() const override;
Brian Osman9a390ac2018-11-12 09:47:48 -050065#endif
joshualitta751c972015-11-20 13:37:32 -080066
Brian Salomon44acb5b2017-07-18 19:59:24 -040067 FixedFunctionFlags fixedFunctionFlags() const override;
68
Chris Dalton6ce447a2019-06-23 18:07:38 -060069 GrProcessorSet::Analysis finalize(const GrCaps&, const GrAppliedClip*,
70 bool hasMixedSampledCoverage, GrClampType) override;
Brian Salomon44acb5b2017-07-18 19:59:24 -040071
Brian Salomoncbcb0a12017-11-19 13:20:13 -050072 enum MaskType {
73 kGrayscaleCoverageMask_MaskType,
74 kLCDCoverageMask_MaskType,
75 kColorBitmapMask_MaskType,
76 kAliasedDistanceField_MaskType,
77 kGrayscaleDistanceField_MaskType,
78 kLCDDistanceField_MaskType,
79 kLCDBGRDistanceField_MaskType,
80 };
81
82 MaskType maskType() const { return fMaskType; }
83
Brian Salomon778a2c92017-11-27 12:18:04 -050084 void finalizeForTextTarget(uint32_t color, const GrCaps&);
85 void executeForTextTarget(SkAtlasTextTarget*);
Brian Salomoncbcb0a12017-11-19 13:20:13 -050086
joshualitta751c972015-11-20 13:37:32 -080087private:
Robert Phillips7c525e62018-06-12 10:11:12 -040088 friend class GrOpMemoryPool; // for ctor
89
Jim Van Verthc8a65e32017-10-25 14:25:27 -040090 // The minimum number of Geometry we will try to allocate.
Jim Van Verth56c37142017-10-31 14:44:25 -040091 static constexpr auto kMinGeometryAllocated = 12;
Jim Van Verthc8a65e32017-10-25 14:25:27 -040092
Herb Derby3c873af2020-04-29 15:56:07 -040093 GrAtlasTextOp(MaskType maskType,
94 GrPaint&& paint,
95 GrTextBlob::SubRun* subrun,
96 const SkMatrix& drawMatrix,
97 SkPoint drawOrigin,
98 const SkIRect& clipRect,
99 const SkPMColor4f& filteredColor,
100 SkColor luminanceColor,
101 bool useGammaCorrectDistanceTable,
102 uint32_t DFGPFlags);
joshualitta751c972015-11-20 13:37:32 -0800103
104 struct FlushInfo {
Brian Salomon344ec422016-12-15 10:58:41 -0500105 sk_sp<const GrBuffer> fVertexBuffer;
106 sk_sp<const GrBuffer> fIndexBuffer;
Robert Phillips7cd0bfe2019-11-20 16:08:10 -0500107 GrGeometryProcessor* fGeometryProcessor;
Chris Dalton304e14d2020-03-17 14:29:06 -0600108 const GrSurfaceProxy** fPrimProcProxies;
Brian Salomon43cbd722020-01-03 22:09:12 -0500109 int fGlyphsToFlush = 0;
110 int fVertexOffset = 0;
111 int fNumDraws = 0;
joshualitta751c972015-11-20 13:37:32 -0800112 };
113
Robert Phillips2669a7b2020-03-12 12:07:19 -0400114 GrProgramInfo* programInfo() override {
115 // TODO [PI]: implement
116 return nullptr;
117 }
118
Robert Phillips4133dc42020-03-11 15:55:55 -0400119 void onCreateProgramInfo(const GrCaps*,
120 SkArenaAlloc*,
Brian Salomon8afde5f2020-04-01 16:22:00 -0400121 const GrSurfaceProxyView* writeView,
Robert Phillips4133dc42020-03-11 15:55:55 -0400122 GrAppliedClip&&,
123 const GrXferProcessor::DstProxyView&) override {
124 // TODO [PI]: implement
125 }
126
Robert Phillips2669a7b2020-03-12 12:07:19 -0400127 void onPrePrepareDraws(GrRecordingContext*,
Brian Salomon8afde5f2020-04-01 16:22:00 -0400128 const GrSurfaceProxyView* writeView,
Robert Phillips2669a7b2020-03-12 12:07:19 -0400129 GrAppliedClip*,
130 const GrXferProcessor::DstProxyView&) override {
131 // TODO [PI]: implement
132 }
133
Brian Salomon91326c32017-08-09 16:02:19 -0400134 void onPrepareDraws(Target*) override;
Chris Dalton07cdcfc92019-02-26 11:13:22 -0700135 void onExecute(GrOpFlushState*, const SkRect& chainBounds) override;
joshualitta751c972015-11-20 13:37:32 -0800136
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
Michael Ludwig28b0c5d2019-12-19 14:51:00 -0500173 CombineResult onCombineIfPossible(GrOp* t, GrRecordingContext::Arenas*,
174 const GrCaps& caps) override;
joshualitta751c972015-11-20 13:37:32 -0800175
Robert Phillips841c9a52020-03-27 12:41:31 -0400176 GrGeometryProcessor* setupDfProcessor(SkArenaAlloc*,
177 const GrShaderCaps&,
Greg Daniel9715b6c2019-12-10 15:03:10 -0500178 const GrSurfaceProxyView* views,
179 unsigned int numActiveViews) const;
joshualitta751c972015-11-20 13:37:32 -0800180
Herb Derby3c873af2020-04-29 15:56:07 -0400181 const MaskType fMaskType;
182 const bool fNeedsGlyphTransform;
183 const SkColor fLuminanceColor{0};
184 const bool fUseGammaCorrectDistanceTable{false};
185 // Distance field properties
186 const uint32_t fDFGPFlags;
Brian Salomon44acb5b2017-07-18 19:59:24 -0400187 SkAutoSTMalloc<kMinGeometryAllocated, Geometry> fGeoData;
Jim Van Verthc8a65e32017-10-25 14:25:27 -0400188 int fGeoDataAllocSize;
Brian Salomon44acb5b2017-07-18 19:59:24 -0400189 GrProcessorSet fProcessors;
Herb Derby3c873af2020-04-29 15:56:07 -0400190 bool fUsesLocalCoords;
Brian Salomon44acb5b2017-07-18 19:59:24 -0400191 int fGeoCount;
192 int fNumGlyphs;
joshualitta751c972015-11-20 13:37:32 -0800193
Brian Salomon44acb5b2017-07-18 19:59:24 -0400194 typedef GrMeshDrawOp INHERITED;
joshualitta751c972015-11-20 13:37:32 -0800195};
196
joshualitta751c972015-11-20 13:37:32 -0800197#endif