blob: 6b821e605e062ec5a5efcc5c159c6c381d907ac5 [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"
12#include "src/gpu/text/GrDistanceFieldAdjustTable.h"
13#include "src/gpu/text/GrTextBlob.h"
joshualitta751c972015-11-20 13:37:32 -080014
Robert Phillipsb97da532019-02-12 15:24:12 -050015class GrRecordingContext;
Brian Salomoncbcb0a12017-11-19 13:20:13 -050016class SkAtlasTextTarget;
17
Brian Salomon44acb5b2017-07-18 19:59:24 -040018class GrAtlasTextOp final : public GrMeshDrawOp {
joshualitta751c972015-11-20 13:37:32 -080019public:
Brian Salomon25a88092016-12-01 09:36:50 -050020 DEFINE_OP_CLASS_ID
joshualitta751c972015-11-20 13:37:32 -080021
Brian Salomonf8334782017-01-03 09:42:58 -050022 ~GrAtlasTextOp() override {
23 for (int i = 0; i < fGeoCount; i++) {
24 fGeoData[i].fBlob->unref();
25 }
26 }
27
Herb Derby86240592018-05-24 16:12:31 -040028 static const int kVerticesPerGlyph = GrTextBlob::kVerticesPerGlyph;
joshualitta751c972015-11-20 13:37:32 -080029 static const int kIndicesPerGlyph = 6;
30
Herb Derby86240592018-05-24 16:12:31 -040031 typedef GrTextBlob Blob;
joshualitta751c972015-11-20 13:37:32 -080032 struct Geometry {
Brian Osmancf860852018-10-31 14:04:39 -040033 SkMatrix fViewMatrix;
34 SkIRect fClipRect;
35 Blob* fBlob;
36 SkScalar fX;
37 SkScalar fY;
38 uint16_t fRun;
39 uint16_t fSubRun;
40 SkPMColor4f fColor;
joshualitta751c972015-11-20 13:37:32 -080041 };
42
Robert Phillipsb97da532019-02-12 15:24:12 -050043 static std::unique_ptr<GrAtlasTextOp> MakeBitmap(GrRecordingContext*,
44 GrPaint&&,
45 GrMaskFormat,
Robert Phillips7c525e62018-06-12 10:11:12 -040046 int glyphCount,
47 bool needsTransform);
joshualitta751c972015-11-20 13:37:32 -080048
Brian Salomonf8334782017-01-03 09:42:58 -050049 static std::unique_ptr<GrAtlasTextOp> MakeDistanceField(
Robert Phillipsb97da532019-02-12 15:24:12 -050050 GrRecordingContext*,
51 GrPaint&&,
Robert Phillips7c525e62018-06-12 10:11:12 -040052 int glyphCount,
Robert Phillipsb97da532019-02-12 15:24:12 -050053 const GrDistanceFieldAdjustTable*,
Robert Phillips7c525e62018-06-12 10:11:12 -040054 bool useGammaCorrectDistanceTable,
55 SkColor luminanceColor,
Robert Phillipsb97da532019-02-12 15:24:12 -050056 const SkSurfaceProps&,
Robert Phillips7c525e62018-06-12 10:11:12 -040057 bool isAntiAliased,
58 bool useLCD);
joshualitta751c972015-11-20 13:37:32 -080059
Brian Salomon344ec422016-12-15 10:58:41 -050060 // To avoid even the initial copy of the struct, we have a getter for the first item which
61 // is used to seed the op with its initial geometry. After seeding, the client should call
62 // init() so the op can initialize itself
joshualitta751c972015-11-20 13:37:32 -080063 Geometry& geometry() { return fGeoData[0]; }
64
Brian Salomon5c6ac642017-12-19 11:09:32 -050065 /** Called after this->geometry() has been configured. */
66 void init();
joshualitta751c972015-11-20 13:37:32 -080067
Brian Salomon344ec422016-12-15 10:58:41 -050068 const char* name() const override { return "AtlasTextOp"; }
joshualitta751c972015-11-20 13:37:32 -080069
Chris Dalton1706cbf2019-05-21 19:35:29 -060070 void visitProxies(const VisitProxyFunc& func) const override;
Robert Phillipsb493eeb2017-09-13 13:10:52 -040071
Brian Osman9a390ac2018-11-12 09:47:48 -050072#ifdef SK_DEBUG
joshualitta751c972015-11-20 13:37:32 -080073 SkString dumpInfo() const override;
Brian Osman9a390ac2018-11-12 09:47:48 -050074#endif
joshualitta751c972015-11-20 13:37:32 -080075
Brian Salomon44acb5b2017-07-18 19:59:24 -040076 FixedFunctionFlags fixedFunctionFlags() const override;
77
Chris Dalton6ce447a2019-06-23 18:07:38 -060078 GrProcessorSet::Analysis finalize(const GrCaps&, const GrAppliedClip*,
79 bool hasMixedSampledCoverage, GrClampType) override;
Brian Salomon44acb5b2017-07-18 19:59:24 -040080
Brian Salomoncbcb0a12017-11-19 13:20:13 -050081 enum MaskType {
82 kGrayscaleCoverageMask_MaskType,
83 kLCDCoverageMask_MaskType,
84 kColorBitmapMask_MaskType,
85 kAliasedDistanceField_MaskType,
86 kGrayscaleDistanceField_MaskType,
87 kLCDDistanceField_MaskType,
88 kLCDBGRDistanceField_MaskType,
89 };
90
91 MaskType maskType() const { return fMaskType; }
92
Brian Salomon778a2c92017-11-27 12:18:04 -050093 void finalizeForTextTarget(uint32_t color, const GrCaps&);
94 void executeForTextTarget(SkAtlasTextTarget*);
Brian Salomoncbcb0a12017-11-19 13:20:13 -050095
joshualitta751c972015-11-20 13:37:32 -080096private:
Robert Phillips7c525e62018-06-12 10:11:12 -040097 friend class GrOpMemoryPool; // for ctor
98
Jim Van Verthc8a65e32017-10-25 14:25:27 -040099 // The minimum number of Geometry we will try to allocate.
Jim Van Verth56c37142017-10-31 14:44:25 -0400100 static constexpr auto kMinGeometryAllocated = 12;
Jim Van Verthc8a65e32017-10-25 14:25:27 -0400101
Robert Phillips5a66efb2018-03-07 15:13:18 -0500102 GrAtlasTextOp(GrPaint&& paint)
Brian Salomon44acb5b2017-07-18 19:59:24 -0400103 : INHERITED(ClassID())
Jim Van Verthc8a65e32017-10-25 14:25:27 -0400104 , fGeoDataAllocSize(kMinGeometryAllocated)
Brian Salomon44acb5b2017-07-18 19:59:24 -0400105 , fProcessors(std::move(paint)) {}
joshualitta751c972015-11-20 13:37:32 -0800106
107 struct FlushInfo {
Brian Salomon344ec422016-12-15 10:58:41 -0500108 sk_sp<const GrBuffer> fVertexBuffer;
109 sk_sp<const GrBuffer> fIndexBuffer;
Hal Canary144caf52016-11-07 17:57:18 -0500110 sk_sp<GrGeometryProcessor> fGeometryProcessor;
Brian Salomon7eae3e02018-08-07 14:02:38 +0000111 GrPipeline::FixedDynamicState* fFixedDynamicState;
Brian Salomon344ec422016-12-15 10:58:41 -0500112 int fGlyphsToFlush;
113 int fVertexOffset;
joshualitta751c972015-11-20 13:37:32 -0800114 };
115
Brian Salomon91326c32017-08-09 16:02:19 -0400116 void onPrepareDraws(Target*) override;
Chris Dalton07cdcfc92019-02-26 11:13:22 -0700117 void onExecute(GrOpFlushState*, const SkRect& chainBounds) override;
joshualitta751c972015-11-20 13:37:32 -0800118
joshualitta751c972015-11-20 13:37:32 -0800119 GrMaskFormat maskFormat() const {
120 switch (fMaskType) {
121 case kLCDCoverageMask_MaskType:
122 return kA565_GrMaskFormat;
123 case kColorBitmapMask_MaskType:
124 return kARGB_GrMaskFormat;
125 case kGrayscaleCoverageMask_MaskType:
Jim Van Verth90e89b32017-07-06 16:36:55 -0400126 case kAliasedDistanceField_MaskType:
joshualitta751c972015-11-20 13:37:32 -0800127 case kGrayscaleDistanceField_MaskType:
128 case kLCDDistanceField_MaskType:
Jim Van Verth90e89b32017-07-06 16:36:55 -0400129 case kLCDBGRDistanceField_MaskType:
joshualitta751c972015-11-20 13:37:32 -0800130 return kA8_GrMaskFormat;
131 }
Brian Salomon344ec422016-12-15 10:58:41 -0500132 return kA8_GrMaskFormat; // suppress warning
joshualitta751c972015-11-20 13:37:32 -0800133 }
134
135 bool usesDistanceFields() const {
Jim Van Verth90e89b32017-07-06 16:36:55 -0400136 return kAliasedDistanceField_MaskType == fMaskType ||
137 kGrayscaleDistanceField_MaskType == fMaskType ||
138 kLCDDistanceField_MaskType == fMaskType ||
139 kLCDBGRDistanceField_MaskType == fMaskType;
joshualitta751c972015-11-20 13:37:32 -0800140 }
141
142 bool isLCD() const {
Jim Van Verth90e89b32017-07-06 16:36:55 -0400143 return kLCDCoverageMask_MaskType == fMaskType ||
144 kLCDDistanceField_MaskType == fMaskType ||
145 kLCDBGRDistanceField_MaskType == fMaskType;
joshualitta751c972015-11-20 13:37:32 -0800146 }
147
Brian Salomone5b399e2017-07-19 13:50:54 -0400148 inline void flush(GrMeshDrawOp::Target* target, FlushInfo* flushInfo) const;
joshualitta751c972015-11-20 13:37:32 -0800149
Brian Osmancf860852018-10-31 14:04:39 -0400150 const SkPMColor4f& color() const { SkASSERT(fGeoCount > 0); return fGeoData[0].fColor; }
Brian Salomon344ec422016-12-15 10:58:41 -0500151 bool usesLocalCoords() const { return fUsesLocalCoords; }
152 int numGlyphs() const { return fNumGlyphs; }
joshualitta751c972015-11-20 13:37:32 -0800153
Brian Salomon7eae3e02018-08-07 14:02:38 +0000154 CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override;
joshualitta751c972015-11-20 13:37:32 -0800155
Brian Osman4a3f5c82018-09-18 16:16:38 -0400156 sk_sp<GrGeometryProcessor> setupDfProcessor(const GrShaderCaps& caps,
157 const sk_sp<GrTextureProxy>* proxies,
Jim Van Verthcbeae032018-05-16 14:54:41 -0400158 unsigned int numActiveProxies) const;
joshualitta751c972015-11-20 13:37:32 -0800159
Brian Salomon44acb5b2017-07-18 19:59:24 -0400160 SkAutoSTMalloc<kMinGeometryAllocated, Geometry> fGeoData;
Jim Van Verthc8a65e32017-10-25 14:25:27 -0400161 int fGeoDataAllocSize;
Brian Salomon44acb5b2017-07-18 19:59:24 -0400162 GrProcessorSet fProcessors;
Jim Van Verthcf838c72018-03-05 14:40:36 -0500163 struct {
164 uint32_t fUsesLocalCoords : 1;
Jim Van Verthcf838c72018-03-05 14:40:36 -0500165 uint32_t fUseGammaCorrectDistanceTable : 1;
Jim Van Verthb515ae72018-05-23 16:44:55 -0400166 uint32_t fNeedsGlyphTransform : 1;
Jim Van Verthcf838c72018-03-05 14:40:36 -0500167 };
Brian Salomon44acb5b2017-07-18 19:59:24 -0400168 int fGeoCount;
169 int fNumGlyphs;
170 MaskType fMaskType;
joshualitta751c972015-11-20 13:37:32 -0800171 // Distance field properties
Hal Canary144caf52016-11-07 17:57:18 -0500172 sk_sp<const GrDistanceFieldAdjustTable> fDistanceAdjustTable;
Jim Van Verthbc2cdd12017-06-08 11:14:35 -0400173 SkColor fLuminanceColor;
Brian Salomon5c6ac642017-12-19 11:09:32 -0500174 uint32_t fDFGPFlags = 0;
joshualitta751c972015-11-20 13:37:32 -0800175
Brian Salomon44acb5b2017-07-18 19:59:24 -0400176 typedef GrMeshDrawOp INHERITED;
joshualitta751c972015-11-20 13:37:32 -0800177};
178
joshualitta751c972015-11-20 13:37:32 -0800179#endif