1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2015 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef skgpu_ganesh_AtlasTextOp_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_ganesh_AtlasTextOp_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMatrix.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/SkColorData.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkPoint_impl.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/AtlasTypes.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrAppliedClip.h" 22*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrBuffer.h" 23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h" 24*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrColorInfo.h" 25*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrColorSpaceXform.h" 26*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProcessorSet.h" 27*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/effects/GrDistanceFieldGeoProc.h" 28*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/ops/GrMeshDrawOp.h" 29*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/ops/GrOp.h" 30*c8dee2aaSAndroid Build Coastguard Worker 31*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef> 32*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 33*c8dee2aaSAndroid Build Coastguard Worker #include <utility> 34*c8dee2aaSAndroid Build Coastguard Worker 35*c8dee2aaSAndroid Build Coastguard Worker class GrDstProxyView; 36*c8dee2aaSAndroid Build Coastguard Worker class GrGeometryProcessor; 37*c8dee2aaSAndroid Build Coastguard Worker class GrMeshDrawTarget; 38*c8dee2aaSAndroid Build Coastguard Worker class GrOpFlushState; 39*c8dee2aaSAndroid Build Coastguard Worker class GrPaint; 40*c8dee2aaSAndroid Build Coastguard Worker class GrProgramInfo; 41*c8dee2aaSAndroid Build Coastguard Worker class GrRecordingContext; 42*c8dee2aaSAndroid Build Coastguard Worker class GrSurfaceProxy; 43*c8dee2aaSAndroid Build Coastguard Worker class GrSurfaceProxyView; 44*c8dee2aaSAndroid Build Coastguard Worker class SkArenaAlloc; 45*c8dee2aaSAndroid Build Coastguard Worker enum class GrXferBarrierFlags; 46*c8dee2aaSAndroid Build Coastguard Worker struct GrShaderCaps; 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Worker namespace sktext { namespace gpu { class AtlasSubRun; } } 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::ganesh { 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker class AtlasTextOp final : public GrMeshDrawOp { 53*c8dee2aaSAndroid Build Coastguard Worker public: 54*c8dee2aaSAndroid Build Coastguard Worker DEFINE_OP_CLASS_ID 55*c8dee2aaSAndroid Build Coastguard Worker ~AtlasTextOp()56*c8dee2aaSAndroid Build Coastguard Worker ~AtlasTextOp() override { 57*c8dee2aaSAndroid Build Coastguard Worker for (const Geometry* g = fHead; g != nullptr;) { 58*c8dee2aaSAndroid Build Coastguard Worker const Geometry* next = g->fNext; 59*c8dee2aaSAndroid Build Coastguard Worker g->~Geometry(); 60*c8dee2aaSAndroid Build Coastguard Worker g = next; 61*c8dee2aaSAndroid Build Coastguard Worker } 62*c8dee2aaSAndroid Build Coastguard Worker } 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker void* operator new(size_t s); 65*c8dee2aaSAndroid Build Coastguard Worker void operator delete(void* b) noexcept; 66*c8dee2aaSAndroid Build Coastguard Worker static void ClearCache(); 67*c8dee2aaSAndroid Build Coastguard Worker 68*c8dee2aaSAndroid Build Coastguard Worker struct Geometry { GeometryGeometry69*c8dee2aaSAndroid Build Coastguard Worker Geometry(const sktext::gpu::AtlasSubRun& subRun, 70*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& drawMatrix, 71*c8dee2aaSAndroid Build Coastguard Worker SkPoint drawOrigin, 72*c8dee2aaSAndroid Build Coastguard Worker SkIRect clipRect, 73*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkRefCnt>&& supportData, 74*c8dee2aaSAndroid Build Coastguard Worker const SkPMColor4f& color) 75*c8dee2aaSAndroid Build Coastguard Worker : fSubRun{subRun} 76*c8dee2aaSAndroid Build Coastguard Worker , fSupportDataKeepAlive{std::move(supportData)} 77*c8dee2aaSAndroid Build Coastguard Worker , fDrawMatrix{drawMatrix} 78*c8dee2aaSAndroid Build Coastguard Worker , fDrawOrigin{drawOrigin} 79*c8dee2aaSAndroid Build Coastguard Worker , fClipRect{clipRect} 80*c8dee2aaSAndroid Build Coastguard Worker , fColor{color} { 81*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fSupportDataKeepAlive != nullptr); 82*c8dee2aaSAndroid Build Coastguard Worker } 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker static Geometry* Make(const sktext::gpu::AtlasSubRun& subRun, 85*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& drawMatrix, 86*c8dee2aaSAndroid Build Coastguard Worker SkPoint drawOrigin, 87*c8dee2aaSAndroid Build Coastguard Worker SkIRect clipRect, 88*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkRefCnt>&& supportData, 89*c8dee2aaSAndroid Build Coastguard Worker const SkPMColor4f& color, 90*c8dee2aaSAndroid Build Coastguard Worker SkArenaAlloc* alloc); 91*c8dee2aaSAndroid Build Coastguard Worker 92*c8dee2aaSAndroid Build Coastguard Worker void fillVertexData(void* dst, int offset, int count) const; 93*c8dee2aaSAndroid Build Coastguard Worker 94*c8dee2aaSAndroid Build Coastguard Worker const sktext::gpu::AtlasSubRun& fSubRun; 95*c8dee2aaSAndroid Build Coastguard Worker 96*c8dee2aaSAndroid Build Coastguard Worker // Keep the TextBlob or Slug alive until the op is deleted. 97*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkRefCnt> fSupportDataKeepAlive; 98*c8dee2aaSAndroid Build Coastguard Worker 99*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix fDrawMatrix; 100*c8dee2aaSAndroid Build Coastguard Worker const SkPoint fDrawOrigin; 101*c8dee2aaSAndroid Build Coastguard Worker 102*c8dee2aaSAndroid Build Coastguard Worker // fClipRect is only used in the DirectMaskSubRun case to do geometric clipping. 103*c8dee2aaSAndroid Build Coastguard Worker // TransformedMaskSubRun, and SDFTSubRun don't use this field, and expect an empty rect. 104*c8dee2aaSAndroid Build Coastguard Worker const SkIRect fClipRect; 105*c8dee2aaSAndroid Build Coastguard Worker 106*c8dee2aaSAndroid Build Coastguard Worker // Color is updated after processor analysis if it was determined the shader resolves to 107*c8dee2aaSAndroid Build Coastguard Worker // a constant color that we then evaluate on the CPU. 108*c8dee2aaSAndroid Build Coastguard Worker // TODO: This can be made const once processor analysis is separated from op creation. 109*c8dee2aaSAndroid Build Coastguard Worker SkPMColor4f fColor; 110*c8dee2aaSAndroid Build Coastguard Worker Geometry* fNext{nullptr}; 111*c8dee2aaSAndroid Build Coastguard Worker }; 112*c8dee2aaSAndroid Build Coastguard Worker name()113*c8dee2aaSAndroid Build Coastguard Worker const char* name() const override { return "AtlasTextOp"; } 114*c8dee2aaSAndroid Build Coastguard Worker 115*c8dee2aaSAndroid Build Coastguard Worker void visitProxies(const GrVisitProxyFunc&) const override; 116*c8dee2aaSAndroid Build Coastguard Worker 117*c8dee2aaSAndroid Build Coastguard Worker FixedFunctionFlags fixedFunctionFlags() const override; 118*c8dee2aaSAndroid Build Coastguard Worker 119*c8dee2aaSAndroid Build Coastguard Worker GrProcessorSet::Analysis finalize(const GrCaps&, const GrAppliedClip*, GrClampType) override; 120*c8dee2aaSAndroid Build Coastguard Worker 121*c8dee2aaSAndroid Build Coastguard Worker enum class MaskType : uint32_t { 122*c8dee2aaSAndroid Build Coastguard Worker kGrayscaleCoverage, 123*c8dee2aaSAndroid Build Coastguard Worker kLCDCoverage, 124*c8dee2aaSAndroid Build Coastguard Worker kColorBitmap, 125*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_DISABLE_SDF_TEXT) 126*c8dee2aaSAndroid Build Coastguard Worker kAliasedDistanceField, 127*c8dee2aaSAndroid Build Coastguard Worker kGrayscaleDistanceField, 128*c8dee2aaSAndroid Build Coastguard Worker kLCDDistanceField, 129*c8dee2aaSAndroid Build Coastguard Worker 130*c8dee2aaSAndroid Build Coastguard Worker kLast = kLCDDistanceField 131*c8dee2aaSAndroid Build Coastguard Worker #else 132*c8dee2aaSAndroid Build Coastguard Worker kLast = kColorBitmap 133*c8dee2aaSAndroid Build Coastguard Worker #endif 134*c8dee2aaSAndroid Build Coastguard Worker }; 135*c8dee2aaSAndroid Build Coastguard Worker inline static constexpr int kMaskTypeCount = static_cast<int>(MaskType::kLast) + 1; 136*c8dee2aaSAndroid Build Coastguard Worker 137*c8dee2aaSAndroid Build Coastguard Worker private: 138*c8dee2aaSAndroid Build Coastguard Worker friend class GrOp; // for ctor 139*c8dee2aaSAndroid Build Coastguard Worker 140*c8dee2aaSAndroid Build Coastguard Worker struct FlushInfo { 141*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrBuffer> fVertexBuffer; 142*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrBuffer> fIndexBuffer; 143*c8dee2aaSAndroid Build Coastguard Worker GrGeometryProcessor* fGeometryProcessor; 144*c8dee2aaSAndroid Build Coastguard Worker const GrSurfaceProxy** fPrimProcProxies; 145*c8dee2aaSAndroid Build Coastguard Worker int fGlyphsToFlush = 0; 146*c8dee2aaSAndroid Build Coastguard Worker int fVertexOffset = 0; 147*c8dee2aaSAndroid Build Coastguard Worker int fNumDraws = 0; 148*c8dee2aaSAndroid Build Coastguard Worker }; 149*c8dee2aaSAndroid Build Coastguard Worker 150*c8dee2aaSAndroid Build Coastguard Worker AtlasTextOp(MaskType maskType, 151*c8dee2aaSAndroid Build Coastguard Worker bool needsTransform, 152*c8dee2aaSAndroid Build Coastguard Worker int glyphCount, 153*c8dee2aaSAndroid Build Coastguard Worker SkRect deviceRect, 154*c8dee2aaSAndroid Build Coastguard Worker Geometry* geo, 155*c8dee2aaSAndroid Build Coastguard Worker const GrColorInfo& dstColorInfo, 156*c8dee2aaSAndroid Build Coastguard Worker GrPaint&& paint); 157*c8dee2aaSAndroid Build Coastguard Worker 158*c8dee2aaSAndroid Build Coastguard Worker AtlasTextOp(MaskType maskType, 159*c8dee2aaSAndroid Build Coastguard Worker bool needsTransform, 160*c8dee2aaSAndroid Build Coastguard Worker int glyphCount, 161*c8dee2aaSAndroid Build Coastguard Worker SkRect deviceRect, 162*c8dee2aaSAndroid Build Coastguard Worker SkColor luminanceColor, 163*c8dee2aaSAndroid Build Coastguard Worker bool useGammaCorrectDistanceTable, 164*c8dee2aaSAndroid Build Coastguard Worker uint32_t DFGPFlags, 165*c8dee2aaSAndroid Build Coastguard Worker Geometry* geo, 166*c8dee2aaSAndroid Build Coastguard Worker GrPaint&& paint); 167*c8dee2aaSAndroid Build Coastguard Worker programInfo()168*c8dee2aaSAndroid Build Coastguard Worker GrProgramInfo* programInfo() override { 169*c8dee2aaSAndroid Build Coastguard Worker // TODO [PI]: implement 170*c8dee2aaSAndroid Build Coastguard Worker return nullptr; 171*c8dee2aaSAndroid Build Coastguard Worker } 172*c8dee2aaSAndroid Build Coastguard Worker addGeometry(Geometry * geometry)173*c8dee2aaSAndroid Build Coastguard Worker void addGeometry(Geometry* geometry) { 174*c8dee2aaSAndroid Build Coastguard Worker *fTail = geometry; 175*c8dee2aaSAndroid Build Coastguard Worker // The geometry may have many entries. Find the end. 176*c8dee2aaSAndroid Build Coastguard Worker do { 177*c8dee2aaSAndroid Build Coastguard Worker fTail = &(*fTail)->fNext; 178*c8dee2aaSAndroid Build Coastguard Worker } while (*fTail != nullptr); 179*c8dee2aaSAndroid Build Coastguard Worker } 180*c8dee2aaSAndroid Build Coastguard Worker onCreateProgramInfo(const GrCaps *,SkArenaAlloc *,const GrSurfaceProxyView & writeView,bool usesMSAASurface,GrAppliedClip &&,const GrDstProxyView &,GrXferBarrierFlags renderPassXferBarriers,GrLoadOp colorLoadOp)181*c8dee2aaSAndroid Build Coastguard Worker void onCreateProgramInfo(const GrCaps*, 182*c8dee2aaSAndroid Build Coastguard Worker SkArenaAlloc*, 183*c8dee2aaSAndroid Build Coastguard Worker const GrSurfaceProxyView& writeView, 184*c8dee2aaSAndroid Build Coastguard Worker bool usesMSAASurface, 185*c8dee2aaSAndroid Build Coastguard Worker GrAppliedClip&&, 186*c8dee2aaSAndroid Build Coastguard Worker const GrDstProxyView&, 187*c8dee2aaSAndroid Build Coastguard Worker GrXferBarrierFlags renderPassXferBarriers, 188*c8dee2aaSAndroid Build Coastguard Worker GrLoadOp colorLoadOp) override { 189*c8dee2aaSAndroid Build Coastguard Worker // We cannot surface the AtlasTextOp's programInfo at record time. As currently 190*c8dee2aaSAndroid Build Coastguard Worker // implemented, the GP is modified at flush time based on the number of pages in the 191*c8dee2aaSAndroid Build Coastguard Worker // atlas. 192*c8dee2aaSAndroid Build Coastguard Worker } 193*c8dee2aaSAndroid Build Coastguard Worker onPrePrepareDraws(GrRecordingContext *,const GrSurfaceProxyView & writeView,GrAppliedClip *,const GrDstProxyView &,GrXferBarrierFlags renderPassXferBarriers,GrLoadOp colorLoadOp)194*c8dee2aaSAndroid Build Coastguard Worker void onPrePrepareDraws(GrRecordingContext*, 195*c8dee2aaSAndroid Build Coastguard Worker const GrSurfaceProxyView& writeView, 196*c8dee2aaSAndroid Build Coastguard Worker GrAppliedClip*, 197*c8dee2aaSAndroid Build Coastguard Worker const GrDstProxyView&, 198*c8dee2aaSAndroid Build Coastguard Worker GrXferBarrierFlags renderPassXferBarriers, 199*c8dee2aaSAndroid Build Coastguard Worker GrLoadOp colorLoadOp) override { 200*c8dee2aaSAndroid Build Coastguard Worker // TODO [PI]: implement 201*c8dee2aaSAndroid Build Coastguard Worker } 202*c8dee2aaSAndroid Build Coastguard Worker 203*c8dee2aaSAndroid Build Coastguard Worker void onPrepareDraws(GrMeshDrawTarget*) override; 204*c8dee2aaSAndroid Build Coastguard Worker void onExecute(GrOpFlushState*, const SkRect& chainBounds) override; 205*c8dee2aaSAndroid Build Coastguard Worker 206*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS) 207*c8dee2aaSAndroid Build Coastguard Worker SkString onDumpInfo() const override; 208*c8dee2aaSAndroid Build Coastguard Worker #endif 209*c8dee2aaSAndroid Build Coastguard Worker maskFormat()210*c8dee2aaSAndroid Build Coastguard Worker skgpu::MaskFormat maskFormat() const { 211*c8dee2aaSAndroid Build Coastguard Worker switch (this->maskType()) { 212*c8dee2aaSAndroid Build Coastguard Worker case MaskType::kLCDCoverage: 213*c8dee2aaSAndroid Build Coastguard Worker return skgpu::MaskFormat::kA565; 214*c8dee2aaSAndroid Build Coastguard Worker case MaskType::kColorBitmap: 215*c8dee2aaSAndroid Build Coastguard Worker return skgpu::MaskFormat::kARGB; 216*c8dee2aaSAndroid Build Coastguard Worker case MaskType::kGrayscaleCoverage: 217*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_DISABLE_SDF_TEXT) 218*c8dee2aaSAndroid Build Coastguard Worker case MaskType::kAliasedDistanceField: 219*c8dee2aaSAndroid Build Coastguard Worker case MaskType::kGrayscaleDistanceField: 220*c8dee2aaSAndroid Build Coastguard Worker case MaskType::kLCDDistanceField: 221*c8dee2aaSAndroid Build Coastguard Worker #endif 222*c8dee2aaSAndroid Build Coastguard Worker return skgpu::MaskFormat::kA8; 223*c8dee2aaSAndroid Build Coastguard Worker } 224*c8dee2aaSAndroid Build Coastguard Worker // SkUNREACHABLE; 225*c8dee2aaSAndroid Build Coastguard Worker return skgpu::MaskFormat::kA8; 226*c8dee2aaSAndroid Build Coastguard Worker } 227*c8dee2aaSAndroid Build Coastguard Worker 228*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_DISABLE_SDF_TEXT) usesDistanceFields()229*c8dee2aaSAndroid Build Coastguard Worker bool usesDistanceFields() const { 230*c8dee2aaSAndroid Build Coastguard Worker return MaskType::kAliasedDistanceField == this->maskType() || 231*c8dee2aaSAndroid Build Coastguard Worker MaskType::kGrayscaleDistanceField == this->maskType() || 232*c8dee2aaSAndroid Build Coastguard Worker MaskType::kLCDDistanceField == this->maskType(); 233*c8dee2aaSAndroid Build Coastguard Worker } 234*c8dee2aaSAndroid Build Coastguard Worker isLCD()235*c8dee2aaSAndroid Build Coastguard Worker bool isLCD() const { 236*c8dee2aaSAndroid Build Coastguard Worker return MaskType::kLCDCoverage == this->maskType() || 237*c8dee2aaSAndroid Build Coastguard Worker MaskType::kLCDDistanceField == this->maskType(); 238*c8dee2aaSAndroid Build Coastguard Worker } 239*c8dee2aaSAndroid Build Coastguard Worker #else isLCD()240*c8dee2aaSAndroid Build Coastguard Worker bool isLCD() const { 241*c8dee2aaSAndroid Build Coastguard Worker return MaskType::kLCDCoverage == this->maskType(); 242*c8dee2aaSAndroid Build Coastguard Worker } 243*c8dee2aaSAndroid Build Coastguard Worker #endif 244*c8dee2aaSAndroid Build Coastguard Worker 245*c8dee2aaSAndroid Build Coastguard Worker inline void createDrawForGeneratedGlyphs( 246*c8dee2aaSAndroid Build Coastguard Worker GrMeshDrawTarget* target, FlushInfo* flushInfo) const; 247*c8dee2aaSAndroid Build Coastguard Worker maskType()248*c8dee2aaSAndroid Build Coastguard Worker MaskType maskType() const { return static_cast<MaskType>(fMaskType); } 249*c8dee2aaSAndroid Build Coastguard Worker 250*c8dee2aaSAndroid Build Coastguard Worker CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps& caps) override; 251*c8dee2aaSAndroid Build Coastguard Worker 252*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_DISABLE_SDF_TEXT) 253*c8dee2aaSAndroid Build Coastguard Worker GrGeometryProcessor* setupDfProcessor(SkArenaAlloc*, 254*c8dee2aaSAndroid Build Coastguard Worker const GrShaderCaps&, 255*c8dee2aaSAndroid Build Coastguard Worker const SkMatrix& localMatrix, 256*c8dee2aaSAndroid Build Coastguard Worker const GrSurfaceProxyView* views, 257*c8dee2aaSAndroid Build Coastguard Worker unsigned int numActiveViews) const; 258*c8dee2aaSAndroid Build Coastguard Worker #endif 259*c8dee2aaSAndroid Build Coastguard Worker 260*c8dee2aaSAndroid Build Coastguard Worker GrProcessorSet fProcessors; 261*c8dee2aaSAndroid Build Coastguard Worker int fNumGlyphs; // Sum of glyphs in each geometry's subrun 262*c8dee2aaSAndroid Build Coastguard Worker 263*c8dee2aaSAndroid Build Coastguard Worker // All combinable atlas ops have equal bit field values 264*c8dee2aaSAndroid Build Coastguard Worker uint32_t fDFGPFlags : 10; // Distance field properties 265*c8dee2aaSAndroid Build Coastguard Worker uint32_t fMaskType : 3; // MaskType 266*c8dee2aaSAndroid Build Coastguard Worker uint32_t fUsesLocalCoords : 1; // Filled in post processor analysis 267*c8dee2aaSAndroid Build Coastguard Worker uint32_t fNeedsGlyphTransform : 1; 268*c8dee2aaSAndroid Build Coastguard Worker uint32_t fHasPerspective : 1; // True if perspective affects draw 269*c8dee2aaSAndroid Build Coastguard Worker uint32_t fUseGammaCorrectDistanceTable : 1; 270*c8dee2aaSAndroid Build Coastguard Worker static_assert(kMaskTypeCount <= 8, "MaskType does not fit in 3 bits"); 271*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_DISABLE_SDF_TEXT) 272*c8dee2aaSAndroid Build Coastguard Worker static_assert(kInvalid_DistanceFieldEffectFlag <= (1 << 9), "DFGP Flags do not fit in 10 bits"); 273*c8dee2aaSAndroid Build Coastguard Worker #endif 274*c8dee2aaSAndroid Build Coastguard Worker 275*c8dee2aaSAndroid Build Coastguard Worker // Only needed for color emoji 276*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrColorSpaceXform> fColorSpaceXform; 277*c8dee2aaSAndroid Build Coastguard Worker 278*c8dee2aaSAndroid Build Coastguard Worker // Only used for distance fields; per-channel luminance for LCD, or gamma-corrected luminance 279*c8dee2aaSAndroid Build Coastguard Worker // for single-channel distance fields. 280*c8dee2aaSAndroid Build Coastguard Worker const SkColor fLuminanceColor{0}; 281*c8dee2aaSAndroid Build Coastguard Worker 282*c8dee2aaSAndroid Build Coastguard Worker Geometry* fHead{nullptr}; 283*c8dee2aaSAndroid Build Coastguard Worker Geometry** fTail{&fHead}; 284*c8dee2aaSAndroid Build Coastguard Worker 285*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GrMeshDrawOp; 286*c8dee2aaSAndroid Build Coastguard Worker }; 287*c8dee2aaSAndroid Build Coastguard Worker 288*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::ganesh 289*c8dee2aaSAndroid Build Coastguard Worker 290*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_ganesh_AtlasTextOp_DEFINED 291