blob: 757ed1f2f9ebb36329ddec208e1b2167254e53d0 [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
Robert Phillipsb97da532019-02-12 15:24:12 -050039 static std::unique_ptr<GrAtlasTextOp> MakeBitmap(GrRecordingContext*,
40 GrPaint&&,
41 GrMaskFormat,
Robert Phillips7c525e62018-06-12 10:11:12 -040042 int glyphCount,
43 bool needsTransform);
joshualitta751c972015-11-20 13:37:32 -080044
Brian Salomonf8334782017-01-03 09:42:58 -050045 static std::unique_ptr<GrAtlasTextOp> MakeDistanceField(
Robert Phillipsb97da532019-02-12 15:24:12 -050046 GrRecordingContext*,
47 GrPaint&&,
Robert Phillips7c525e62018-06-12 10:11:12 -040048 int glyphCount,
Robert Phillips7c525e62018-06-12 10:11:12 -040049 bool useGammaCorrectDistanceTable,
50 SkColor luminanceColor,
Robert Phillipsb97da532019-02-12 15:24:12 -050051 const SkSurfaceProps&,
Robert Phillips7c525e62018-06-12 10:11:12 -040052 bool isAntiAliased,
53 bool useLCD);
joshualitta751c972015-11-20 13:37:32 -080054
Brian Salomon344ec422016-12-15 10:58:41 -050055 // To avoid even the initial copy of the struct, we have a getter for the first item which
56 // is used to seed the op with its initial geometry. After seeding, the client should call
57 // init() so the op can initialize itself
joshualitta751c972015-11-20 13:37:32 -080058 Geometry& geometry() { return fGeoData[0]; }
59
Brian Salomon5c6ac642017-12-19 11:09:32 -050060 /** Called after this->geometry() has been configured. */
61 void init();
joshualitta751c972015-11-20 13:37:32 -080062
Brian Salomon344ec422016-12-15 10:58:41 -050063 const char* name() const override { return "AtlasTextOp"; }
joshualitta751c972015-11-20 13:37:32 -080064
Chris Dalton1706cbf2019-05-21 19:35:29 -060065 void visitProxies(const VisitProxyFunc& func) const override;
Robert Phillipsb493eeb2017-09-13 13:10:52 -040066
Brian Osman9a390ac2018-11-12 09:47:48 -050067#ifdef SK_DEBUG
joshualitta751c972015-11-20 13:37:32 -080068 SkString dumpInfo() const override;
Brian Osman9a390ac2018-11-12 09:47:48 -050069#endif
joshualitta751c972015-11-20 13:37:32 -080070
Brian Salomon44acb5b2017-07-18 19:59:24 -040071 FixedFunctionFlags fixedFunctionFlags() const override;
72
Chris Dalton6ce447a2019-06-23 18:07:38 -060073 GrProcessorSet::Analysis finalize(const GrCaps&, const GrAppliedClip*,
74 bool hasMixedSampledCoverage, GrClampType) override;
Brian Salomon44acb5b2017-07-18 19:59:24 -040075
Brian Salomoncbcb0a12017-11-19 13:20:13 -050076 enum MaskType {
77 kGrayscaleCoverageMask_MaskType,
78 kLCDCoverageMask_MaskType,
79 kColorBitmapMask_MaskType,
80 kAliasedDistanceField_MaskType,
81 kGrayscaleDistanceField_MaskType,
82 kLCDDistanceField_MaskType,
83 kLCDBGRDistanceField_MaskType,
84 };
85
86 MaskType maskType() const { return fMaskType; }
87
Brian Salomon778a2c92017-11-27 12:18:04 -050088 void finalizeForTextTarget(uint32_t color, const GrCaps&);
89 void executeForTextTarget(SkAtlasTextTarget*);
Brian Salomoncbcb0a12017-11-19 13:20:13 -050090
joshualitta751c972015-11-20 13:37:32 -080091private:
Robert Phillips7c525e62018-06-12 10:11:12 -040092 friend class GrOpMemoryPool; // for ctor
93
Jim Van Verthc8a65e32017-10-25 14:25:27 -040094 // The minimum number of Geometry we will try to allocate.
Jim Van Verth56c37142017-10-31 14:44:25 -040095 static constexpr auto kMinGeometryAllocated = 12;
Jim Van Verthc8a65e32017-10-25 14:25:27 -040096
Robert Phillips5a66efb2018-03-07 15:13:18 -050097 GrAtlasTextOp(GrPaint&& paint)
Brian Salomon44acb5b2017-07-18 19:59:24 -040098 : INHERITED(ClassID())
Jim Van Verthc8a65e32017-10-25 14:25:27 -040099 , fGeoDataAllocSize(kMinGeometryAllocated)
Brian Salomon44acb5b2017-07-18 19:59:24 -0400100 , fProcessors(std::move(paint)) {}
joshualitta751c972015-11-20 13:37:32 -0800101
102 struct FlushInfo {
Brian Salomon344ec422016-12-15 10:58:41 -0500103 sk_sp<const GrBuffer> fVertexBuffer;
104 sk_sp<const GrBuffer> fIndexBuffer;
Robert Phillips7cd0bfe2019-11-20 16:08:10 -0500105 GrGeometryProcessor* fGeometryProcessor;
Chris Dalton304e14d2020-03-17 14:29:06 -0600106 const GrSurfaceProxy** fPrimProcProxies;
Brian Salomon43cbd722020-01-03 22:09:12 -0500107 int fGlyphsToFlush = 0;
108 int fVertexOffset = 0;
109 int fNumDraws = 0;
joshualitta751c972015-11-20 13:37:32 -0800110 };
111
Robert Phillips2669a7b2020-03-12 12:07:19 -0400112 GrProgramInfo* programInfo() override {
113 // TODO [PI]: implement
114 return nullptr;
115 }
116
Robert Phillips4133dc42020-03-11 15:55:55 -0400117 void onCreateProgramInfo(const GrCaps*,
118 SkArenaAlloc*,
Brian Salomon8afde5f2020-04-01 16:22:00 -0400119 const GrSurfaceProxyView* writeView,
Robert Phillips4133dc42020-03-11 15:55:55 -0400120 GrAppliedClip&&,
121 const GrXferProcessor::DstProxyView&) override {
122 // TODO [PI]: implement
123 }
124
Robert Phillips2669a7b2020-03-12 12:07:19 -0400125 void onPrePrepareDraws(GrRecordingContext*,
Brian Salomon8afde5f2020-04-01 16:22:00 -0400126 const GrSurfaceProxyView* writeView,
Robert Phillips2669a7b2020-03-12 12:07:19 -0400127 GrAppliedClip*,
128 const GrXferProcessor::DstProxyView&) override {
129 // TODO [PI]: implement
130 }
131
Brian Salomon91326c32017-08-09 16:02:19 -0400132 void onPrepareDraws(Target*) override;
Chris Dalton07cdcfc92019-02-26 11:13:22 -0700133 void onExecute(GrOpFlushState*, const SkRect& chainBounds) override;
joshualitta751c972015-11-20 13:37:32 -0800134
joshualitta751c972015-11-20 13:37:32 -0800135 GrMaskFormat maskFormat() const {
136 switch (fMaskType) {
137 case kLCDCoverageMask_MaskType:
138 return kA565_GrMaskFormat;
139 case kColorBitmapMask_MaskType:
140 return kARGB_GrMaskFormat;
141 case kGrayscaleCoverageMask_MaskType:
Jim Van Verth90e89b32017-07-06 16:36:55 -0400142 case kAliasedDistanceField_MaskType:
joshualitta751c972015-11-20 13:37:32 -0800143 case kGrayscaleDistanceField_MaskType:
144 case kLCDDistanceField_MaskType:
Jim Van Verth90e89b32017-07-06 16:36:55 -0400145 case kLCDBGRDistanceField_MaskType:
joshualitta751c972015-11-20 13:37:32 -0800146 return kA8_GrMaskFormat;
147 }
Brian Salomon344ec422016-12-15 10:58:41 -0500148 return kA8_GrMaskFormat; // suppress warning
joshualitta751c972015-11-20 13:37:32 -0800149 }
150
151 bool usesDistanceFields() const {
Jim Van Verth90e89b32017-07-06 16:36:55 -0400152 return kAliasedDistanceField_MaskType == fMaskType ||
153 kGrayscaleDistanceField_MaskType == fMaskType ||
154 kLCDDistanceField_MaskType == fMaskType ||
155 kLCDBGRDistanceField_MaskType == fMaskType;
joshualitta751c972015-11-20 13:37:32 -0800156 }
157
158 bool isLCD() const {
Jim Van Verth90e89b32017-07-06 16:36:55 -0400159 return kLCDCoverageMask_MaskType == fMaskType ||
160 kLCDDistanceField_MaskType == fMaskType ||
161 kLCDBGRDistanceField_MaskType == fMaskType;
joshualitta751c972015-11-20 13:37:32 -0800162 }
163
Herb Derby4513cdd2020-01-31 13:28:49 -0500164 inline void createDrawForGeneratedGlyphs(
165 GrMeshDrawOp::Target* target, FlushInfo* flushInfo) const;
joshualitta751c972015-11-20 13:37:32 -0800166
Brian Osmancf860852018-10-31 14:04:39 -0400167 const SkPMColor4f& color() const { SkASSERT(fGeoCount > 0); return fGeoData[0].fColor; }
Brian Salomon344ec422016-12-15 10:58:41 -0500168 bool usesLocalCoords() const { return fUsesLocalCoords; }
169 int numGlyphs() const { return fNumGlyphs; }
joshualitta751c972015-11-20 13:37:32 -0800170
Michael Ludwig28b0c5d2019-12-19 14:51:00 -0500171 CombineResult onCombineIfPossible(GrOp* t, GrRecordingContext::Arenas*,
172 const GrCaps& caps) override;
joshualitta751c972015-11-20 13:37:32 -0800173
Robert Phillips841c9a52020-03-27 12:41:31 -0400174 GrGeometryProcessor* setupDfProcessor(SkArenaAlloc*,
175 const GrShaderCaps&,
Greg Daniel9715b6c2019-12-10 15:03:10 -0500176 const GrSurfaceProxyView* views,
177 unsigned int numActiveViews) const;
joshualitta751c972015-11-20 13:37:32 -0800178
Brian Salomon44acb5b2017-07-18 19:59:24 -0400179 SkAutoSTMalloc<kMinGeometryAllocated, Geometry> fGeoData;
Jim Van Verthc8a65e32017-10-25 14:25:27 -0400180 int fGeoDataAllocSize;
Brian Salomon44acb5b2017-07-18 19:59:24 -0400181 GrProcessorSet fProcessors;
Jim Van Verthcf838c72018-03-05 14:40:36 -0500182 struct {
183 uint32_t fUsesLocalCoords : 1;
Jim Van Verthcf838c72018-03-05 14:40:36 -0500184 uint32_t fUseGammaCorrectDistanceTable : 1;
Jim Van Verthb515ae72018-05-23 16:44:55 -0400185 uint32_t fNeedsGlyphTransform : 1;
Jim Van Verthcf838c72018-03-05 14:40:36 -0500186 };
Brian Salomon44acb5b2017-07-18 19:59:24 -0400187 int fGeoCount;
188 int fNumGlyphs;
189 MaskType fMaskType;
joshualitta751c972015-11-20 13:37:32 -0800190 // Distance field properties
Jim Van Verthbc2cdd12017-06-08 11:14:35 -0400191 SkColor fLuminanceColor;
Brian Salomon5c6ac642017-12-19 11:09:32 -0500192 uint32_t fDFGPFlags = 0;
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