blob: 16020d03471abfdbb4ea3a80e925363a5ce2d57f [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;
Herb Derby92cc5802020-06-04 09:59:38 -040037
Herb Derby64391c42020-05-16 14:32:15 -040038 void fillVertexData(void* dst, int offset, int count) const;
joshualitta751c972015-11-20 13:37:32 -080039 };
40
Herb Derby3c873af2020-04-29 15:56:07 -040041 static std::unique_ptr<GrAtlasTextOp> MakeBitmap(GrRecordingContext* context,
42 GrPaint&& paint,
43 GrTextBlob::SubRun* subrun,
44 const SkMatrix& drawMatrix,
45 SkPoint drawOrigin,
46 const SkIRect& clipRect,
47 const SkPMColor4f& filteredColor);
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&&,
Herb Derby3c873af2020-04-29 15:56:07 -040052 GrTextBlob::SubRun*,
53 const SkMatrix& drawMatrix,
54 SkPoint drawOrigin,
55 const SkIRect& clipRect,
56 const SkPMColor4f& filteredColor,
Robert Phillips7c525e62018-06-12 10:11:12 -040057 bool useGammaCorrectDistanceTable,
58 SkColor luminanceColor,
Herb Derby3c873af2020-04-29 15:56:07 -040059 const SkSurfaceProps&);
joshualitta751c972015-11-20 13:37:32 -080060
Brian Salomon344ec422016-12-15 10:58:41 -050061 const char* name() const override { return "AtlasTextOp"; }
joshualitta751c972015-11-20 13:37:32 -080062
Chris Dalton1706cbf2019-05-21 19:35:29 -060063 void visitProxies(const VisitProxyFunc& func) const override;
Robert Phillipsb493eeb2017-09-13 13:10:52 -040064
Brian Osman9a390ac2018-11-12 09:47:48 -050065#ifdef SK_DEBUG
joshualitta751c972015-11-20 13:37:32 -080066 SkString dumpInfo() const override;
Brian Osman9a390ac2018-11-12 09:47:48 -050067#endif
joshualitta751c972015-11-20 13:37:32 -080068
Brian Salomon44acb5b2017-07-18 19:59:24 -040069 FixedFunctionFlags fixedFunctionFlags() const override;
70
Chris Dalton6ce447a2019-06-23 18:07:38 -060071 GrProcessorSet::Analysis finalize(const GrCaps&, const GrAppliedClip*,
72 bool hasMixedSampledCoverage, GrClampType) override;
Brian Salomon44acb5b2017-07-18 19:59:24 -040073
Brian Salomoncbcb0a12017-11-19 13:20:13 -050074 enum MaskType {
75 kGrayscaleCoverageMask_MaskType,
76 kLCDCoverageMask_MaskType,
77 kColorBitmapMask_MaskType,
78 kAliasedDistanceField_MaskType,
79 kGrayscaleDistanceField_MaskType,
80 kLCDDistanceField_MaskType,
81 kLCDBGRDistanceField_MaskType,
82 };
83
84 MaskType maskType() const { return fMaskType; }
85
Brian Salomon778a2c92017-11-27 12:18:04 -050086 void finalizeForTextTarget(uint32_t color, const GrCaps&);
87 void executeForTextTarget(SkAtlasTextTarget*);
Brian Salomoncbcb0a12017-11-19 13:20:13 -050088
joshualitta751c972015-11-20 13:37:32 -080089private:
Robert Phillips7c525e62018-06-12 10:11:12 -040090 friend class GrOpMemoryPool; // for ctor
91
Jim Van Verthc8a65e32017-10-25 14:25:27 -040092 // The minimum number of Geometry we will try to allocate.
Jim Van Verth56c37142017-10-31 14:44:25 -040093 static constexpr auto kMinGeometryAllocated = 12;
Jim Van Verthc8a65e32017-10-25 14:25:27 -040094
Herb Derby3c873af2020-04-29 15:56:07 -040095 GrAtlasTextOp(MaskType maskType,
96 GrPaint&& paint,
97 GrTextBlob::SubRun* subrun,
98 const SkMatrix& drawMatrix,
99 SkPoint drawOrigin,
100 const SkIRect& clipRect,
101 const SkPMColor4f& filteredColor,
102 SkColor luminanceColor,
103 bool useGammaCorrectDistanceTable,
104 uint32_t DFGPFlags);
joshualitta751c972015-11-20 13:37:32 -0800105
106 struct FlushInfo {
Brian Salomon344ec422016-12-15 10:58:41 -0500107 sk_sp<const GrBuffer> fVertexBuffer;
108 sk_sp<const GrBuffer> fIndexBuffer;
Robert Phillips7cd0bfe2019-11-20 16:08:10 -0500109 GrGeometryProcessor* fGeometryProcessor;
Chris Dalton304e14d2020-03-17 14:29:06 -0600110 const GrSurfaceProxy** fPrimProcProxies;
Brian Salomon43cbd722020-01-03 22:09:12 -0500111 int fGlyphsToFlush = 0;
112 int fVertexOffset = 0;
113 int fNumDraws = 0;
joshualitta751c972015-11-20 13:37:32 -0800114 };
115
Robert Phillips2669a7b2020-03-12 12:07:19 -0400116 GrProgramInfo* programInfo() override {
117 // TODO [PI]: implement
118 return nullptr;
119 }
120
Robert Phillips4133dc42020-03-11 15:55:55 -0400121 void onCreateProgramInfo(const GrCaps*,
122 SkArenaAlloc*,
Brian Salomon8afde5f2020-04-01 16:22:00 -0400123 const GrSurfaceProxyView* writeView,
Robert Phillips4133dc42020-03-11 15:55:55 -0400124 GrAppliedClip&&,
125 const GrXferProcessor::DstProxyView&) override {
126 // TODO [PI]: implement
127 }
128
Robert Phillips2669a7b2020-03-12 12:07:19 -0400129 void onPrePrepareDraws(GrRecordingContext*,
Brian Salomon8afde5f2020-04-01 16:22:00 -0400130 const GrSurfaceProxyView* writeView,
Robert Phillips2669a7b2020-03-12 12:07:19 -0400131 GrAppliedClip*,
132 const GrXferProcessor::DstProxyView&) override {
133 // TODO [PI]: implement
134 }
135
Brian Salomon91326c32017-08-09 16:02:19 -0400136 void onPrepareDraws(Target*) override;
Chris Dalton07cdcfc92019-02-26 11:13:22 -0700137 void onExecute(GrOpFlushState*, const SkRect& chainBounds) override;
joshualitta751c972015-11-20 13:37:32 -0800138
joshualitta751c972015-11-20 13:37:32 -0800139 GrMaskFormat maskFormat() const {
140 switch (fMaskType) {
141 case kLCDCoverageMask_MaskType:
142 return kA565_GrMaskFormat;
143 case kColorBitmapMask_MaskType:
144 return kARGB_GrMaskFormat;
145 case kGrayscaleCoverageMask_MaskType:
Jim Van Verth90e89b32017-07-06 16:36:55 -0400146 case kAliasedDistanceField_MaskType:
joshualitta751c972015-11-20 13:37:32 -0800147 case kGrayscaleDistanceField_MaskType:
148 case kLCDDistanceField_MaskType:
Jim Van Verth90e89b32017-07-06 16:36:55 -0400149 case kLCDBGRDistanceField_MaskType:
joshualitta751c972015-11-20 13:37:32 -0800150 return kA8_GrMaskFormat;
151 }
Brian Salomon344ec422016-12-15 10:58:41 -0500152 return kA8_GrMaskFormat; // suppress warning
joshualitta751c972015-11-20 13:37:32 -0800153 }
154
155 bool usesDistanceFields() const {
Jim Van Verth90e89b32017-07-06 16:36:55 -0400156 return kAliasedDistanceField_MaskType == fMaskType ||
157 kGrayscaleDistanceField_MaskType == fMaskType ||
158 kLCDDistanceField_MaskType == fMaskType ||
159 kLCDBGRDistanceField_MaskType == fMaskType;
joshualitta751c972015-11-20 13:37:32 -0800160 }
161
162 bool isLCD() const {
Jim Van Verth90e89b32017-07-06 16:36:55 -0400163 return kLCDCoverageMask_MaskType == fMaskType ||
164 kLCDDistanceField_MaskType == fMaskType ||
165 kLCDBGRDistanceField_MaskType == fMaskType;
joshualitta751c972015-11-20 13:37:32 -0800166 }
167
Herb Derby4513cdd2020-01-31 13:28:49 -0500168 inline void createDrawForGeneratedGlyphs(
169 GrMeshDrawOp::Target* target, FlushInfo* flushInfo) const;
joshualitta751c972015-11-20 13:37:32 -0800170
Brian Osmancf860852018-10-31 14:04:39 -0400171 const SkPMColor4f& color() const { SkASSERT(fGeoCount > 0); return fGeoData[0].fColor; }
Brian Salomon344ec422016-12-15 10:58:41 -0500172 bool usesLocalCoords() const { return fUsesLocalCoords; }
173 int numGlyphs() const { return fNumGlyphs; }
joshualitta751c972015-11-20 13:37:32 -0800174
Michael Ludwig28b0c5d2019-12-19 14:51:00 -0500175 CombineResult onCombineIfPossible(GrOp* t, GrRecordingContext::Arenas*,
176 const GrCaps& caps) override;
joshualitta751c972015-11-20 13:37:32 -0800177
Robert Phillips841c9a52020-03-27 12:41:31 -0400178 GrGeometryProcessor* setupDfProcessor(SkArenaAlloc*,
179 const GrShaderCaps&,
Greg Daniel9715b6c2019-12-10 15:03:10 -0500180 const GrSurfaceProxyView* views,
181 unsigned int numActiveViews) const;
joshualitta751c972015-11-20 13:37:32 -0800182
Herb Derby3c873af2020-04-29 15:56:07 -0400183 const MaskType fMaskType;
184 const bool fNeedsGlyphTransform;
185 const SkColor fLuminanceColor{0};
186 const bool fUseGammaCorrectDistanceTable{false};
187 // Distance field properties
188 const uint32_t fDFGPFlags;
Brian Salomon44acb5b2017-07-18 19:59:24 -0400189 SkAutoSTMalloc<kMinGeometryAllocated, Geometry> fGeoData;
Jim Van Verthc8a65e32017-10-25 14:25:27 -0400190 int fGeoDataAllocSize;
Brian Salomon44acb5b2017-07-18 19:59:24 -0400191 GrProcessorSet fProcessors;
Herb Derby3c873af2020-04-29 15:56:07 -0400192 bool fUsesLocalCoords;
Brian Salomon44acb5b2017-07-18 19:59:24 -0400193 int fGeoCount;
194 int fNumGlyphs;
joshualitta751c972015-11-20 13:37:32 -0800195
Brian Salomon44acb5b2017-07-18 19:59:24 -0400196 typedef GrMeshDrawOp INHERITED;
joshualitta751c972015-11-20 13:37:32 -0800197};
198
joshualitta751c972015-11-20 13:37:32 -0800199#endif